首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用lambda表达式的右值和左值引用-- gcc与msvc

使用lambda表达式的右值和左值引用-- gcc与msvc
EN

Stack Overflow用户
提问于 2013-06-16 04:34:49
回答 3查看 959关注 0票数 6

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

代码语言:javascript
运行
复制
int main()
{
    auto& f = []() -> void {};
    return 0;
}

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-16 04:38:41

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

标准说no。右值只能绑定到常量左值引用。

我相信相关的标准段落是8.5.3/5

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

..。

  • 否则,引用应该是对非易失性常量类型的左值引用(即,cv1应该是常量),或者引用应该是右值引用。

然而,微软有一个长期存在的“功能”,它允许这种non-standard行为,这解释了你所看到的。

票数 7
EN

Stack Overflow用户

发布于 2013-06-16 04:37:09

然而,微软编译器确实接受了它,这意味着它要么接受非标准代码,要么C++允许左值引用绑定到右值λ表达式的特殊情况。

MSVC以拥有这个(不是很棒的)编译器扩展而闻名。它只允许将右值绑定到非const的左值引用

代码语言:javascript
运行
复制
A& x = A(); // Illegal in C++, allowed by MSVC
票数 3
EN

Stack Overflow用户

发布于 2013-06-16 04:57:08

致国际标准化组织C++标准委员会主席quote Herb Sutter:

符合COBOL语言规范的C++编译器总是可以允许其他非法的C++代码编译,并赋予它某种意义-嘿,如果某个古怪的编译器编写器愿意实现该扩展,它可以选择允许内联

,也许在几个太多的Tequilas之后。对于某些类型的扩展,C++标准要求编译器至少发出一些诊断信息,以表明代码不是有效的C++,就像本编译器所做的那样。

他进一步解释了下面的例子是非法的:

代码语言:javascript
运行
复制
// Example 2

string f() { return "abc"; }

void g() {
string& s = f();       // illegal?
  cout << s << endl;
}

请访问Sutter的这个link获取解释,以避免复制SO上的文章。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17127652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档