我正在阅读的书说,当您的类包含引用成员或常量成员时,使用编译器生成的复制构造函数或赋值运算符将不起作用。例如,
#include <iostream>
#include <string>
using namespace std;
class TextBlock
{
public:
TextBlock (string str) : s(str) {
cout << "Constructor is being called" << endl;
}
string& s;
};
int main () {
TextBlock p("foo");
TextBlock q(p);
q = p;
cout << "Q's s is " << q.s << endl;
return(0);
}
根据我的书,TextBlock q(p);
和 q = p;
这两个行都应该返回编译器错误。但是使用 Linux 的 g++ 编译器时,我只收到 q = p;
行的错误 当我注释掉它时,它工作正常并且代码编译。正确的 s 是 Q 的输出,所以它显然是由编译器生成的复制构造函数复制的。当我将 string& s;
行更改为 const string s
时,我得到了相同的结果。
是否对 C++ 进行了一些更改,现在允许为引用和常量对象自动生成复制构造函数,但不允许为赋值运算符生成复制构造函数?或者也许我只是没有正确理解这本书?有什么想法吗?
最佳答案
这本书错了。常量成员或引用成员将 禁止生成默认的复制赋值运算符,但是 不会阻止编译器生成复制构造函数。
关于c++ - 编译器为具有引用和常量成员的类生成的复制/赋值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23205799/