请考虑以下事项:
#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()
之间是否存在差异(编译器行为,性能)?
答案 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>