【发布时间】:2014-06-06 00:19:43
【问题描述】:
我正在阅读的书说,当您的类包含一个引用或常量的成员时,使用编译器生成的复制构造函数或赋值运算符将不起作用。例如,
#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++ 进行了一些更改,现在允许为引用和 const 对象自动生成复制构造函数,但不允许为赋值运算符生成?或者也许我只是没有正确理解这本书?有什么想法吗?
【问题讨论】:
-
请注意,
TextBlock p("foo");是未定义的行为。你最终会得到一个悬空的引用。 -
@JamesKanze 成员引用绑定到构造函数的参数取值。
-
@JamesKanze 在构造函数中有一个临时的
string,引用绑定到那个。 -
感谢您向我指出这一点,@juanchopanza。
-
@juanchopanza 啊。我看的不够近。 (我从未见过通过值传递
std::string的代码。通常的规则是类类型总是通过引用传递给 const。)
标签: c++ compiler-construction copy-constructor assignment-operator