c++ - 编译器为具有引用和常量成员的类生成的复制/赋值函数

标签 c++ compiler-construction copy-constructor assignment-operator

我正在阅读的书说,当您的类包含引用成员或常量成员时,使用编译器生成的复制构造函数或赋值运算符将不起作用。例如,

#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/

相关文章:

c++ - 如何使用 Clang 从 C++ 字符串生成 AST?

compiler-construction - Io Language 无法构建 : Foundation/Foundation. h:没有这样的文件或目录

C++ 复制构造函数,带指针

c - 如何在 C 中运行莎士比亚 (.SPL) 文件

c++ - 从复制构造函数调用默认赋值运算符是不好的形式吗?

c++ - 我认为数组是不可复制的

c++ - 按对象的属性对对象的 vector 进行排序

c++ - 字符到类型的非 constexpr 转换

C++ 在不重定向输出的情况下运行批处理文件

compiler-construction - 作为我的编译器的后端?