【发布时间】:2020-03-24 21:04:23
【问题描述】:
假设我们有两个成员函数的成员类,定义如下:
class SomeClass
{
private:
int val = {};
public:
const int getVarLRef() & {
return val;
}
const int getVarCLRef() const& {
return val;
}
};
int main()
{
auto var1 = SomeClass().getVarCLRef();
auto var2 = SomeClass().getVarLRef();
return 0;
}
我不太明白const& 和& 之间的区别。
如果我们将此函数指定为const&,为什么它与getVarCLRef 一起工作?不应该只允许用左值调用吗?
另一方面,getVarLRef 工作正常,但在这种情况下无法按预期编译。
我使用 C++11 和 gcc 7.3.0
【问题讨论】:
-
请注意,您的示例中的
auto转换为int,而不是int&。如果你希望它是一个引用类型,你应该改用auto&。 -
有趣的观察。我猜stackoverflow.com/questions/23011532/… 和stackoverflow.com/questions/21861148/… 的答案并不正确(他们中的大多数人都在谈论
&要求对象是左值)... -
旁注:通过 const 值返回毫无意义,无论如何都会复制该值(发生复制省略不会改变任何内容),这只会使代码更难阅读。在最坏的情况下,您只是阻止能够直接使用该对象 (
x.get().foo();),但您仍然可以几乎总是(从 C++17 开始;由于 guaranteed copy elision)被auto y = x.get(); y.foo();规避.
标签: c++ reference constants lvalue