我看过 Nicolai Josuttis(C++ 标准委员会成员)的演讲(准确的时间戳,不是他解释的),他说从 C++11 开始,getter 应该这样写:
const std::string& getName() const&
{
return memberStringVar;
}
问题是,和这个getter相比有什么区别?
const std::string& getName() const
{
return memberStringVar;
}
在演讲中给出的示例中,给出了
getName()
的两个重载。
一个带有 &&
,另一个带有 const&
限定符。
如果
&
之后没有 const
,则无法使用右值 const std::string& getName() const
的重载来重载函数 string Customer::getName() &&
。
如果您希望代码正常工作,则必须从代码中完全删除右值重载。
由于仅在 C++11 中添加了 ref 限定成员函数(使得右值的 getter 成为可能),因此需要从
const std::string& getName() const
更改为 const std::string& getName() const&
才能使两种重载成为可能。
C++17 标准草案 n4659 指出:
16.1 可重载声明 [over.load]
...2 某些函数声明不能重载:
...
(2.3) — 具有相同名称和相同参数类型列表的成员函数声明以及具有相同名称、相同参数类型列表和相同模板参数列表的成员函数模板声明 不能如果其中任何一个(但不是全部)具有引用限定符,则重载。
由于
getName()
的一个重载带有 ref 限定符 (&&
),因此另一个重载也应该具有 ref 限定符。这就是为什么需要 const&
。