What are the use cases for having a function return by const value for non-builtin type?
最近我已经了解到,当从函数中按值返回以限定非内置类型的返回类型const时,这是有意义的,例如:
1 2 3 4 | const Result operation() { //..do something.. return Result(..); } |
我正在努力理解这一点的好处,一旦对象被返回,那么调用方肯定会选择是否将返回的对象设置为const?
基本上,这里有一个轻微的语言问题。
1 2 3 4 5 | std::string func() { return"hai"; } func().push_back('c'); // Perfectly valid, yet non-sensical |
返回常量值是防止此类行为的一种尝试。然而,在现实中,它确实弊大于利,因为现在右值引用出现在这里,您只需要防止移动语义,这很糟糕,而且通过明智地使用右值和左值
它偶尔有用。请参见此示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class I { public: I(int i) : value(i) {} void set(int i) { value = i; } I operator+(const I& rhs) { return I(value + rhs.value); } I& operator=(const I& rhs) { value = rhs.value; return *this; } private: int value; }; int main() { I a(2), b(3); (a + b) = 2; // ??? return 0; } |
注意,
如果将
按值返回没有好处。这没有道理。
唯一的区别是它阻止人们将其用作左值:
1 2 3 4 5 6 7 8 9 10 11 | class Foo { void bar(); }; const Foo foo(); int main() { foo().bar(); // Invalid } |