05 July 2022

C++ 核心指南目录

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

强化

应该用工具检查任何赋值操作符的返回值类型和数值