C++ C++;方法中的引用变量
这样做有意义吗:C++ C++;方法中的引用变量,c++,reference,C++,Reference,这样做有意义吗: class SomeClass { public: static Object getObject() { return Object("example") } }; int main() { const Object& myObject = SomeClass::getObject(); // do something with myObject } 或者,这与仅仅获得类似的对象是一样的吗 const Ob
class SomeClass
{
public:
static Object getObject()
{
return Object("example")
}
};
int main()
{
const Object& myObject = SomeClass::getObject();
// do something with myObject
}
或者,这与仅仅获得类似的对象是一样的吗
const Object myObject = SomeClass::getObject();
?从Herb Sutter关于这个主题的文章中可以发现,这两种情况都是正确的: 通常情况下,临时对象仅持续到完整场景结束 它出现的表达式。但是,C++故意指定 将临时对象绑定到堆栈上对const的引用 将临时对象的生存期延长到 引用本身,从而避免了在其他情况下可能是常见的引用 悬挂参考错误
但是如果您从案例1中删除
const
,它将不正常 使用NRVO时,两者之间存在细微差异
命名的返回值优化只能用于局部变量。参考文献不是:
auto foo() -> Object
{
const Object& myObject = SomeClass::getObject();
return myObject; // no NRVO in this case
}
auto foo() -> Object
{
const Object myObject = SomeClass::getObject();
return myObject; // NRVO applies in this case
}
第一个创建对临时对象的引用。
const
延长了临时对象的寿命,因此这样做是安全的。第二个创建一个新对象,可能是通过移动语义。您可能不会注意到两者之间的任何区别。@mvidelgauz实际上不是一个引用可以延长临时对象的生存期,在这种情况下是合法的。@Slava不,他们没有,也从来没有。@Slava一个非常量引用甚至不能用一个临时对象开始初始化,更不用说延长同一对象的生存期了<代码>对象&myObject=SomeClass::getObject()代码>不编译(除非MSVC默认接受此代码作为非标准扩展)。< C++>空>主/ <代码>在C++中是被禁止的。code>main必须具有返回类型int
代码>可以完成。