Return C++ 中赋值运算符的类型

Return type of assignment operator in C++

假设我有这样一个 class:

public:
A(const int a);
A& operator = (const A&);
};

为什么“=”运算符的 return 类型必须是“A&”而不是简单的“A”?

return类型没有A&;标准只说:

A user-declared copy assignment operator X​::​operator= is a non-static non-template member function of class X with exactly one parameter of type X, X&, const X&, volatile X&, or const volatile X&.

我们按照惯例这样做。

oft-cited 的论点是您可以“链式”赋值 (a = b = c),但老实说,这并不是一种常见的模式。我认为它在某种程度上是货物崇拜编程,但它不会伤害任何人,而且保持一致性很好。

缺点是大多数人甚至不使用这种 return 类型,有时它的实际原因可能会丢失(根据这个问题!)。

我们不 return A,因为 return 按 operated-on 对象的值(即 returning _copy)相反会更没用,并且会混淆赋值运算符的目的,即 not 来创建一个新的 A.

所有这些构建没有错误:

  • A& operator = (const A&);
  • A& operator = (A&);
  • A& operator = (const A&);
  • A& operator = (A);
  • A operator = (const A&);
  • const A& operator = (const A&);
  • void operator = (const A&);

复制赋值运算符是一个类似于任何其他函数的函数。您甚至可以在调用任何其他函数时显式调用它:

A test;               
A testToBeCopied;
test.operator=(testToBeCopied);

您可以预期是否为 const,也可以像任何其他函数一样在有或没有 const 的情况下调用复制赋值运算符函数。您不必期待 const 或 ref。你甚至可以return作废。另一方面,通过引用传递或值传递来调用函数,是否期望签名中有 const 取决于您的需要。方法链接是需要 returning ref 的一个例子。你可以通过 ref 因为效率和你不需要另一个新创建的对象。