Purpose of returning by const value?
警察的目的是什么?
1 2 3 | const Object myFunc(){ return myObject; } |
我刚刚开始阅读有效的C++,项目3提倡这一点,谷歌搜索也提出类似的建议,但也有反例。我不知道在这里使用const会有多好。假设按值返回是可取的,我看不到任何理由来保护返回值。给出了为什么这可能有用的示例,以防止返回值的意外bool强制转换。因此,实际的问题是,应该使用explicit关键字来防止隐式bool强制转换。
在此处使用const可防止在未赋值的情况下使用临时对象。所以我不能用这些对象执行算术表达式。似乎从来没有一个不知名的警察有用的案例。
在这里使用const有什么好处?什么时候更可取?
编辑:将算术示例更改为修改可能要在赋值之前执行的对象的任何函数。
型
在假设的情况下,您可以对一个对象执行一个可能昂贵的非常量操作,按常量值返回可以防止您意外地对临时对象调用此操作。假设
1 | (a + b).expensive(); |
。
然而,在C++ 11的时代,强烈建议将值作为非const返回,这样就可以充分利用rValk引用,这在非常量rValo上是有意义的。
总之,这种做法是有道理的,但实际上已经过时了。
型
从函数返回
很难让它对您的代码产生任何影响:
1 2 3 4 5 6 7 8 | const int foo() { return 3; } int main() { int x = foo(); // copies happily x = 4; } |
以及:
1 2 3 4 5 6 7 8 9 | const int foo() { return 3; } int main() { foo() = 4; // not valid anyway for built-in types } // error: lvalue required as left operand of assignment |
号
尽管您可以注意到返回类型是否为用户定义的类型:
1 2 3 4 5 6 7 8 9 10 11 | 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 |
这是否对任何人都有好处是值得怀疑的。
返回一个引用是不同的,但是除非
型
它确保返回的对象(此时为右值)不能被修改。这确保用户不能这样认为:
1 | myFunc() = Object(...); |
如果引用返回
型
myObject可以是指针。"const"用于保护myObject指向的值。
型
它可以用作返回对私有常量数据类型的引用的包装函数。例如,在一个链接列表中,您有常数tail和head,如果您想确定一个节点是tail还是head节点,那么您可以将它与该函数返回的值进行比较。
尽管任何优化器都很可能优化它…