通过const值返回的目的?
这个const的目的是什么?
const Object myFunc(){ return myObject; }
我刚刚开始阅读有效的C + +和项目3提倡这一点,谷歌search拿起类似的build议,但也反例。 我不明白如何在这里使用const将是可取的。 假设按价值回报是可取的,我不认为有任何理由来保护返回的价值。 给出的例子为什么这可能是有益的是防止意想不到的布尔转换的返回值。 那么实际的问题是,应该用explicit关键字来防止隐式bool转换。
在这里使用const可以防止在不分配的情况下使用临 所以我不能用这些对象来执行算术expression式。 似乎没有一个无名的const有用的情况。
在这里使用const获得了什么,什么时候会更好?
编辑:将算术示例更改为任何修改您可能要在分配之前执行的对象的任何函数。 (这是我的第一篇文章,哇,我不能相信有多快,人们把代码示例和坑坑洼洼的链接,好的答案,谢谢!)
在假设的情况下,你可以在一个对象上执行一个潜在的昂贵的非const操作,通过const-value返回可以防止你在临时的时候意外地调用这个操作。 想象一下, +
返回一个非const值,你可以写:
(a + b).expensive();
然而,在C ++ 11的时代,强烈build议将值返回为非常量,以便充分利用右值引用,这只对非常量右值有意义。
总之,这种做法有一个基本原理,但实质上已经过时了。
从函数返回一个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
尽pipe您可以注意到返回types是用户定义的types :
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
是一些模板参数,否则你没有这样做。
C ++ 11使它对移动对象非常有用。 例如:
const std::unique_ptr<T> myFunc();
unique_ptr
是不能复制的types; 它只能被移动。 但是你不能在const
types上调用std::move
。 因此,存储这个的唯一方法是使用const&
或const&&
:
const std::unique_ptr<T> &ptr = myFunc();
由于它是一个const unique_ptr
,所以不能从中移动。 也不能从中复制。 这意味着要长期实际存储这一点非常困难。 你可以把它放在堆栈上。 但是使其成为一个类的成员是不可能的(不调用未定义的行为)。
这样可以确保指针不会长期存储。 这允许创buildunique_ptr
的特定版本,其删除者实际上并不删除内存。 这样,一个函数可以返回一个指针,知道用户不能在任何地方存储它。
当然,这也使得调用者返回值相当困难。 所以有缺点。
它确保返回的对象(这是一个RValue在这一点)不能被修改。 这确保用户不能这样想:
myFunc() = Object(...);
如果myFunc
通过引用返回,那么这将会很好地工作,但几乎肯定是由值返回的错误(并且可能不会被编译器捕获)。 当然,在C ++ 11中,这个约定并没有像之前那么有意义,因为const对象不能被移动,所以这会对性能产生很大的影响。
它可以用作包装函数来返回一个私有常量数据types的引用。 例如,在一个链表中,你有常量tail和head,如果你想确定一个节点是尾节点还是头节点,那么你可以将它与该函数返回的值进行比较。
尽pipe任何优化器都可能会优化它。
myObject可以是一个指针。 那里的'const'保护myObject指向的值。