当类成员是引用时无法生成默认赋值运算符?(在 C++ 中)

Posted

技术标签:

【中文标题】当类成员是引用时无法生成默认赋值运算符?(在 C++ 中)【英文标题】:Cannot generate default assignment operator when a class member is a reference?(in C++) 【发布时间】:2014-10-28 17:12:42 【问题描述】:

这是我的代码:

class NO 
  public:
    NO(std::string& name):nameValue(name);

  private:
    std::string& nameValue;           // this is now a reference

;

int main()

  int b=10,c=20;
  int& d=b;
  d=c;

  std::string p="alpha", q="beta";

  NO x(p), y(q);
  x=y;

  return 0;


我得到错误:

"non-static reference member ‘std::string& NO::nameValue’, can’t use default assignment operator"

当我可以对内置类型执行相同操作时,为什么我不能使用引用成员重新分配对象?

谢谢

【问题讨论】:

我觉得这应该可以工作,但是......有什么语义?我们必须期待什么? x.nameValue 必须指向 y.nameValuex.nameValue 必须复制 y.nameValue 的值? (与p=q 相同) 【参考方案1】:

一个引用可以被初始化,但不能被赋值。一旦引用被初始化,只要它存在,它将继续引用同一个对象。如果您不定义赋值运算符,编译器将合成一个进行成员分配的运算符,但在这种情况下这是不可能的,因此编译器根本无法/不会合成一个。

您可以自己定义赋值运算符。由您决定如何处理作为参考的成员。大多数时候,您只是将对象定义为不包含任何引用。

当您深入了解它时,用于引用的主要 几乎可以肯定是作为参数。作为一个类的成员,它们通常没有意义,在极少数情况下它们确实有意义,该类的对象可能不支持赋值。

【讨论】:

以上是关于当类成员是引用时无法生成默认赋值运算符?(在 C++ 中)的主要内容,如果未能解决你的问题,请参考以下文章

当类构造与析构的时候...

当类构造与析构的时候...

c++中为啥赋值运算符重载返回类型是引用

C++构造函数的default和delete

深浅拷贝,深浅赋值语句

C++Primer 第十三章