【发布时间】:2019-06-18 14:23:40
【问题描述】:
C++ 编译器不会为具有引用成员的类提供默认的复制赋值运算符(以及其他一些场景)。 原因是,如果提供了默认的复制赋值运算符,那么源对象和目标对象的引用成员都引用同一个副本。
但是,在相同的场景中提供了默认的复制构造函数,这引入了与提供默认的复制赋值运算符相同的问题。
提供默认复制构造函数的任何原因?
#include <iostream>
using namespace std;
class People{
public:
People(string name = ""):m_name(name){
}
string getName(){
return m_name;
}
void setName(string name){
m_name = name;
}
private:
string& m_name;//reference member
};
int main() {
People a("Erik");
People b(a);
a.setName("Tom");
cout << a.getName() << endl;//This prints "Tom"
cout << b.getName() << endl;//This prints "Tom"
//a = b; //Build error
return 0;
}
【问题讨论】:
-
未定义的行为可能会做一些令人惊讶的事情。
-
注意 - 您正在获取构造函数的参数按值,然后保存对它的引用。如果您使用该引用,那将是未定义的行为。
-
"如果提供了默认的复制赋值运算符,那么源对象和目标对象的引用成员都指向同一个副本" 对不起,我不明白那句话。跨度>
-
这一行:
m_name = name;在执行时是未定义的行为。那是因为m_name是对已销毁对象的引用。您的代码编写方式表明您对引用是什么以及它们如何工作存在重大误解。 -
@Omnifarious 从技术上讲,如果您从不使用该引用,它真的是 UB 吗?
标签: c++ copy-constructor