通过const值返回的目的?
这个问题在这里已经有了答案:
在假设情况下,您可以对对象执行潜在的非常昂贵的非常量操作,通过const-value返回可以防止您意外地在临时调用此操作。 想象一下, +
返回一个非const值,你可以写:
(a + b).expensive();
然而,在C ++ 11时代,强烈建议将值作为非常量返回,以便充分利用右值引用,这只对非常量右值有意义。
总之,这种做法有一个基本原理,但实质上已经过时。
这是很没有意义的返回一个const
从一个函数值。
很难让它对你的代码有任何影响:
const int foo() {
return 3;
}
int main() {
int x = foo(); // copies happily
x = 4;
}
和:
const int foo() {
return 3;
}
int main() {
foo() = 4; // not valid anyway for built-in types
}
// error: lvalue required as left operand of assignment
虽然您可以注意到返回类型是否是用户定义的类型:
struct T {};
const T foo() {
return T();
}
int main() {
foo() = T();
}
// error: passing ‘const T’ as ‘this’ argument of ‘T& T::operator=(const T&)’ discards qualifiers
这是否对任何人都有好处是值得怀疑的。
返回一个引用是不同的,但除非Object
是一些模板参数,否则你没有这样做。
它确保返回的对象(在该点是一个RValue)不能被修改。 这可以确保用户不会这样想:
myFunc() = Object(...);
如果myFunc
通过引用返回,那么这将很好地工作,但几乎肯定是由值返回的错误(并且可能不会被编译器捕获)。 当然,在C ++ 11中,这个约定并没有像之前那么有意义,因为const对象不能被移出,所以这会对性能产生相当大的影响。