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
可以完成。