带有lambda表达式的rvalue和左值引用 - gcc与msvc

a.l*_*ram 5 c++ gcc visual-c++ c++11

在C++中,将rvalue隐式转换为左值引用是非法的.考虑以下代码,其中左值引用绑定到右值(lambda):

int main()
{
    auto& f = []() -> void {};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc(4.8.1)不接受这样的代码(完全有道理).但是,Microsoft编译器确实接受它意味着要么接受非标准代码,要么C++允许左值引用绑定到rvalue lambda表达式的特定情况.

问题:哪个假设是正确的?

sya*_*yam 6

你的问题的核心是:rvalues可以绑定到非const 左值引用吗?

标准说没有.rvalues只能绑定到const 左值引用.

我认为相关的标准段落是8.5.3/5:

对类型"cv1 T1"的引用由类型"cv2 T2"的表达式初始化,如下所示:

...

  • 否则,引用应是对非易失性const类型的左值引用(即,cv1应为const),或者引用应为右值引用.

然而,微软有一个长期存在的"功能",允许这种非标准的行为,这解释了你正在目睹的事情.

  • @MartinBa:回复你的评论,标准之外的任何东西,恕我直言,不是一个功能,而是一个错误.C++并不完美,但特定于供应商的"改进"在互操作性方面是PITA,它们应该被火烧死.YMMV(但是当你开始从事跨平台项目时,这变得非常重要). (2认同)
  • 如果在MSVC中打开警告级别4,则会收到有关使用非标准扩展的警告.鉴于此,我没有看到为写入单一平台的人提供一些方便的语言扩展的危害. (2认同)