通过const值返回的目的?

时间:2012-01-03 17:39:32

标签: c++ const

这个const的目的是什么?

const Object myFunc(){
    return myObject;
}

我刚刚开始阅读Effective C ++,而第3项提倡这一点,Google搜索也提出了类似的建议,但也有反作用。我看不出在这里使用const会更好。假设需要按值返回,我认为没有任何理由保护返回的值。给出为什么这可能有用的示例是防止返回值的意外bool强制转换。实际问题是应该使用explicit关键字来防止隐式bool强制转换。

使用const可以防止在没有赋值的情况下使用临时对象。所以我无法用这些对象执行算术表达式。似乎没有一个未命名的const有用的情况。

在这里使用const可以获得什么?什么时候更适合?

编辑:将算术示例更改为修改在分配之前可能要执行的对象的任何函数。

5 个答案:

答案 0 :(得分:110)

在假设情况下,您可以对对象执行可能非常昂贵的非const操作,通过const-value返回可以防止您意外地在临时上调用此操作。想象一下,+返回了一个非const值,你可以写:

(a + b).expensive();

然而,在C ++ 11时代,强烈建议将值作为非const返回,以便您可以充分利用rvalue引用,这只对非常数rvalues有意义。

总之,这种做法的基本原理,但它基本上是过时的。

答案 1 :(得分:38)

It's pretty pointless从函数返回const值。

difficult让它对您的代码产生任何影响:

const int foo() {
   return 3;
}

int main() {
   int x = foo();  // copies happily
   x = 4;
}

and

const int foo() {
   return 3;
}

int main() {
   foo() = 4;  // not valid anyway for built-in types
}

// error: lvalue required as left operand of assignment

虽然you can notice if the return type is a user-defined type

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是某个模板参数,否则您不会这样做。

答案 2 :(得分:4)

确保无法修改返回的对象(该点为RValue)。这样可以确保用户不会这样想:

myFunc() = Object(...);

如果通过引用返回myFunc,那将很好地工作,但是当按值返回时几乎肯定是一个错误(并且可能不会被编译器捕获)。当然,在带有rvalues的C ++ 11中,这个约定没有像之前那样有意义,因为const对象不能被移动,所以这会对性能产生非常大的影响。

答案 3 :(得分:-3)

它可以用作包装函数,用于返回对私有常量数据类型的引用。例如,在链表中你有常量tail和head,如果你想确定一个节点是尾节点还是头节点,那么你可以将它与该函数返回的值进行比较。

虽然任何优化器都很可能最终优化它......

答案 4 :(得分:-3)

myObject可能是一个指针。 'const'保护myObject指向的值。