编译器为具有引用和常量成员的类生成了复制/赋值函数
Compiler-generated copy/assignment functions for classes with reference and const members
我正在读的书中说,当类包含引用或常量的成员时,使用编译器生成的复制构造函数或赋值运算符将不起作用。例如,
#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++是否有一些更改,现在允许为引用和常量对象自动生成复制构造函数,但不允许为赋值运算符生成复制构造函数?或者我只是没有正确理解这本书?有什么想法吗?
这本书错了。常量成员或引用成员将禁止生成默认的副本分配运算符,但是不会阻止编译器生成复制构造函数。
不要试图在这里学习特殊规则。
编译器生成的特殊成员函数的默认版本遵循一个简单的模式:
- 为每个子对象(基类和成员)调用适合类型的特殊成员函数
由此,你可以计算出每一个案例。
int i;
int &ri1 = i;
int &ri2 = ri1;
因此允许复制包含int&
的对象。
引用没有赋值运算符(ri2 = ri1;
不重新绑定引用),因此不允许赋值。
引用不能默认构造:
int& ri; // error
因此不能默认构造包含CCD_ 8的类型。
一个重要的考虑因素是对编译器默认代码进行访问检查,就像您自己编写的一样。因此,如果基类有一个私有的复制构造函数,那么有趣的事情就会发生。。。你不必为他们中的任何一个学习特殊规则。
相关文章:
- 为什么默认复制函数在按值发送参数时不调用?
- 在 c++ 中对字符串使用复制函数时打印的垃圾值
- C++复制函数重载导致"must be a nonstatic member function"错误
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 在实现和调用时可以复制函数参数名称吗?
- 使用 c++ 复制函数有什么问题
- 如何在C++中省略对不同参数的复制函数定义
- 我正在尝试使用 fread 和 fwrite 来制作复制函数,但根据缓冲区大小,我不断得到奇怪的输出
- 谁复制函数的返回值
- 从STL复制函数以打印出矢量
- 试图在vector类中创建复制函数
- 字符串复制函数中这两个while循环条件的区别
- 检查类是否有复制函数?返回真或假
- 复制函数打印字符串地址,而不是字符串内容
- 对复制函数进行单元测试
- STL复制函数的实现
- Py_InitModule复制名称,但不复制函数指针
- 当派生函数定义了析构函数时,使用复制函数而不是移动函数
- 在编译时复制C/C++函数
- STL:c++中的转换和复制函数问题