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表达式的特定情况.
问题:哪个假设是正确的?
你的问题的核心是:rvalues可以绑定到非const 左值引用吗?
标准说没有.rvalues只能绑定到const 左值引用.
我认为相关的标准段落是8.5.3/5:
对类型"cv1 T1"的引用由类型"cv2 T2"的表达式初始化,如下所示:
...
- 否则,引用应是对非易失性const类型的左值引用(即,cv1应为const),或者引用应为右值引用.
然而,微软有一个长期存在的"功能",允许这种非标准的行为,这解释了你正在目睹的事情.