如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
C++ Difference between copy initialization and const reference initialization if value comes from member variable
考虑以下内容:
#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;
};
通常,如果您使用对R值的常数引用,则延长R值的寿命以匹配参考的寿命...
1。但是,如果r值是对象的成员变量?
要么复制该值,要么对成员变量进行引用,但只要成员变量的值不更改即可有效...
2。因此,在我的理解中,必须复制该值,对
3。因此, 存在微不足道的技术差异。(正如M.M在评论中指出的那样。( 首先,这个: 初始化字符串 但这是: 初始化字符串 在这两种情况下,都制作了一个副本...并添加 通常,如果您使用对R值的常数引用,则延长R值的寿命以匹配参考的寿命。 这是不正确的。正确的语句是"如果您创建const rvalue引用和未命名的临时对象,则该临时对象的寿命会延长以匹配rvalue参考的寿命"。 没有临时对象意味着没有生命周期扩展。特别是,当方法返回参考时,它会返回参考。没有创建未命名的临时对象,因此没有什么可以延长其生命周期了。只有当它按值返回非参考的实际对象并且该对象未命名,因此有一个实际未命名的临时返回值对象,而RVO不会忽略RVO,是否有机会扩展该临时性的寿命。<<<<<<<</p>
const string myVal1 = myObj.getMyMember1()
和const string &myRef1 = myObj.getMyMember1()
(编译器行为,性能(之间是否存在区别?const string myVal1 = myObj.getMyMember1();
const
,该字符串是myObj
成员值的副本。const string &myRef1 = myObj.getMyMember1();
const
引用myObj
成员返回的临时性,并且永远无法重新分配。const
承诺编译器这些值不会被重新分配。
- 类的方法和对象。参考?智能指针?简单的初始化?
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 如何调用成员初始化器列表中参考成员的构造函数
- 如果值来自成员变量,则复制初始化和参考初始化之间的C 差异
- 为什么参考变量在声明时需要初始化
- 如何编写工厂功能以在C 中初始化constexpr参考
- 用整数值初始化非常量参考
- 为什么初始化列表中的自定义参考不是错误
- C 11-是参考的初始化,而不是表达式
- 从模板类初始化对象时出错.参考类模板实例化
- C 使用每个元素参考初始化数组
- 初始化向量通过参考
- const参考变量初始化
- 如果铸造运算符对类型和引用类型的引用,为什么直接列表初始化会导致类型参考铸件的模棱两可
- 类初始化的const参考
- 直接初始化和复制参考初始化
- 用文字初始化参考成员变量
- 当私有unique_ptr参与类定义时,C 中的参考初始化
- 初始化C 的参考类型
- 为什么通过条件操作员将参考传递到初始化列表会导致警告