C ++如果值来自成员变量,则复制​​初始化和const引用初始化之间存在差异

时间:2018-04-04 21:15:13

标签: c++ c++11

请考虑以下事项:

#include <iostream>

using namespace std;

class MyClass {
    public:
        MyClass(string myMemberInitValue);
        const string getMyMember1();
    private:
        string myMember;
};

MyClass::MyClass(string myMemberInitValue) :
    myMember(myMemberInitValue)
{}

const string MyClass::getMyMember1()
{
    return myMember;
}

int main()
{
    MyClass myObj("Hello World");

    const string myVal1 = myObj.getMyMember1(); // Ok
    const string &myRef1 = myObj.getMyMember1(); // A reference to an rvalue

    ...

    return 0;
};

通常情况下,如果您使用常量reference to a r-value lifetime of the r-value is extended to match the lifetime of the reference ...

1。但是,如果r值是对象的成员变量怎么办?

要么复制值,要么对成员变量进行引用,但只要成员变量的值不变,就会有效...

2。所以在我的理解中,无论如何必须复制价值,对吗?

第3。那么const string myVal1 = myObj.getMyMember1()const string &myRef1 = myObj.getMyMember1()之间是否存在差异(编译器行为,性能)?

2 个答案:

答案 0 :(得分:4)

技术差异微不足道。 (正如M.M在评论中指出的那样。)

首先,这个:

const string myVal1 = myObj.getMyMember1();

初始化字符串const,它是myObj成员值的副本。

但是这个:

const string &myRef1 = myObj.getMyMember1();

初始化const成员返回的字符串myObj reference to a temporary,永远不会被重新分配。

在这两种情况下,都会复制... And adding const承诺编译器不会重新分配这些值。

答案 1 :(得分:2)

  

通常,如果使用对r值的常量引用,则会扩展r值的生命周期以匹配引用的生命周期。

这是不正确的。正确的语句是“如果您创建一个const rvalue引用和未命名的临时对象,则该临时对象的生命周期将被扩展以匹配右值引用的生命周期”。

没有临时对象意味着没有终身延长。特别是,当方法返回引用时,它返回一个引用。没有创建未命名的临时对象,因此没有任何东西可以延长其生命周期。只有当它按值返回非引用的实际对象并且该对象未被命名时,才有一个实际未命名的临时返回值对象,RVO没有将其删除,是否有机会延长该临时对象的生命周期。 / p>