CppCoreGuidelines F.47 赋值操作符返回 T&
05 July 2022
F.47: Return T&
from assignment operators
理由
operator=(const T&)
操作符重载的通常操作是先进行赋值,然后再返回一个非
const
的*this
。这样就和标准库类型保持一致。并遵循“像 int 那样执行”的原则。
注意
在过去,有些指南说赋值操作符要返回const T&
。主要是为了避免这种形式的代码(a = b) = c
。不过这种代码不太常见,所以没必要因此而与标准类型不一致。
例子
// -*- compile-command: "g++ -std=c++20 code.cpp && ./a"; -*- #include <iostream> #include <gsl/gsl> using namespace std; using namespace gsl; class Foo { public: Foo() = default; Foo(int v) : foo_val(v) {} Foo& operator=(const Foo& rhs) { // Copy members. foo_val = rhs.foo_val; return *this; } int foo_val = 0; }; int main() { Foo rhs(10); Foo n; cout << n.foo_val << endl; cout << (n = rhs).foo_val << endl; cout << n.foo_val; return 0; }
0 10 10
强化
应该用工具检查任何赋值操作符的返回值类型和数值