在C++中,将右值隐式转换为左值引用是非法的。考虑以下代码,其中一个左值引用绑定到一个右值( lambda):
int main()
{
auto& f = []() -> void {};
return 0;
}
gcc (4.8.1)不接受这样的代码(完全有道理)。然而,微软编译器确实接受它,这意味着它要么接受非标准代码,要么C++允许左值引用绑定到右值lambda表达式的特殊情况。
问题是:哪个假设是正确的?
发布于 2013-06-16 04:38:41
你问题的核心是:右值可以绑定到非常数左值引用吗?
标准说no。右值只能绑定到常量左值引用。
我相信相关的标准段落是8.5.3/5
对“cv1 T1”类型的引用由“cv2 T2”类型的表达式初始化,如下所示:
..。
然而,微软有一个长期存在的“功能”,它允许这种non-standard行为,这解释了你所看到的。
发布于 2013-06-16 04:37:09
然而,微软编译器确实接受了它,这意味着它要么接受非标准代码,要么C++允许左值引用绑定到右值λ表达式的特殊情况。
MSVC以拥有这个(不是很棒的)编译器扩展而闻名。它只允许将右值绑定到非const
的左值引用
A& x = A(); // Illegal in C++, allowed by MSVC
发布于 2013-06-16 04:57:08
致国际标准化组织C++标准委员会主席quote Herb Sutter:
符合COBOL语言规范的C++编译器总是可以允许其他非法的C++代码编译,并赋予它某种意义-嘿,如果某个古怪的编译器编写器愿意实现该扩展,它可以选择允许内联
,也许在几个太多的Tequilas之后。对于某些类型的扩展,C++标准要求编译器至少发出一些诊断信息,以表明代码不是有效的C++,就像本编译器所做的那样。
他进一步解释了下面的例子是非法的:
// Example 2
string f() { return "abc"; }
void g() {
string& s = f(); // illegal?
cout << s << endl;
}
请访问Sutter的这个link获取解释,以避免复制SO上的文章。
https://stackoverflow.com/questions/17127652
复制相似问题