C ++如果值来自成员变量,则复制 初始化和const引用初始化之间存在差异
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++如果值来自成员变量,则复制 初始化和const引用初始化之间存在差异相关的知识,希望对你有一定的参考价值。
考虑以下:
#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 ...
但是,如果r值是对象的成员变量怎么办?
要么复制值,要么对成员变量进行引用,但只要成员变量的值不改变,它就会有效...
所以在我的理解中,无论如何必须复制价值,对吧?
3. const string myVal1 = myObj.getMyMember1()
和const string &myRef1 = myObj.getMyMember1()
(编译器行为,性能)之间有区别吗?
技术差异可以忽略不计。 (正如M.M在评论中指出的那样。)
首先,这个:
const string myVal1 = myObj.getMyMember1();
初始化一个字符串const
,它是myObj
成员值的副本。
但是这个:
const string &myRef1 = myObj.getMyMember1();
初始化由const
成员返回的字符串reference to a temporary myObj
,永远不能重新分配。
在这两种情况下,都会制作副本... And adding const
承诺编译器不会重新分配这些值。
通常,如果使用对r值的常量引用,则会延长r值的生命周期以匹配引用的生命周期。
这是不正确的。正确的语句是“如果您创建一个const rvalue引用和未命名的临时对象,则该临时对象的生命周期将被扩展以匹配rvalue引用的生命周期”。
没有临时对象意味着没有终身延长。特别是,当方法返回引用时,它返回一个引用。没有创建未命名的临时对象,因此没有任何东西可以延长其生命周期。只有当它按值返回非引用的实际对象并且该对象未被命名时,才有一个实际未命名的临时返回值对象,RVO没有将其删除,是否有机会延长该临时对象的生命周期。
以上是关于C ++如果值来自成员变量,则复制 初始化和const引用初始化之间存在差异的主要内容,如果未能解决你的问题,请参考以下文章