首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按价值返回总是有价值的吗?

按价值返回总是有价值的吗?
EN

Stack Overflow用户
提问于 2012-11-14 19:09:25
回答 8查看 271关注 0票数 3

此代码不编译:

代码语言:javascript
运行
复制
class C {};

void foo (C& c) {}

C bar() { return C(); }

int main()              
{
  foo(bar());
}               

foo(bar())行中的编译错误(GCC 4.1.2)

从临时类型“C”中初始化“C&”类型的非const引用无效

bar()返回mutable对象时,它应该编译.

为什么C++不允许上面的代码?

编辑:,我在an answer below中总结了来自所有答案的所有好想法;-)

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-11-14 19:13:46

这里适用的规则是,您不能创建对临时对象的非const引用。如果foo被声明为foo(const C&),那么代码就可以了。

不过,临时对象本身并不是const;您可以在其上调用非const成员函数,例如bar().non_const_member_function()

使用C++11,可以编写foo以获取rvalue引用;在这种情况下,调用是可以的:

代码语言:javascript
运行
复制
void foo(C&&);
foo(bar());  // okay
票数 13
EN

Stack Overflow用户

发布于 2012-11-14 19:12:27

这是因为bar返回的值是一个临时值。因为它的存在是暂时的,所以不能使用指针或引用。

但是,如果存储该临时对象的副本(如在第二次更改中),则不再将对临时对象的引用传递给foo,而是传递对实际有形对象的引用。在第一种情况下,当您更改为对常量对象的引用时,编译器确保临时对象保持足够长的时间(按照C++规范)。

票数 8
EN

Stack Overflow用户

发布于 2012-11-14 19:13:01

可修改(lvalue-)引用不绑定到临时值。但是,const-引用确实绑定到临时值。它与值返回的对象是否为const无关;这只是一个表达式是否是临时表达式的问题。

例如,以下内容是有效的:

代码语言:javascript
运行
复制
struct C { void i_am_non_const() {} };

int main()
{
    bar().i_am_non_const();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13385601

复制
相关文章

相似问题

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