问题描述
我看到了这样的代码。
struct S{
int get() const &{
return 5;
}
};
int main(){
S s;
return s.get();
}
解决方法
方法签名上的 const &
表示调用对象应绑定到 const 左值引用。
但是,since rvalue can be bound to a const lvalue ref,下面的代码可以编译:
struct S{
int get() const &{
return 5;
}
};
int main(){
return S{}.get(); // compiles,S{} can be bound to const lvalue
}
要查看 & 的实际含义,您可以为 && 添加一个版本或删除 const:
使用 const && 的重载:
struct S{
int get() const &{
return 5;
}
int get() const && {
return -5;
}
};
int main(){
return S{}.get(); // returns -5
}
有&但没有const:
struct S{
int get() & {
return 5;
}
};
int main(){
return S{}.get(); // compilation error cannot bind rvalue to lvalue
}
,
const 表示函数本身是 const - 该函数修改类/结构的成员数据项是编译时错误,因此可以使用 const 调用该函数对类实例的引用。
尾随的 & 非常不寻常(我从未在野外见过)。这意味着对用于调用此函数的实例的引用必须是左值。必须从右值调用后跟 && 的函数。
我相信一个函数可以被声明和定义两次,一次使用&,一次使用&&,因为它构成了签名的一部分。这对于某些模糊的优化很有用(显然)。