通过const值返回的目的?

Pra*_*tic 119 c++ const

const的目的是什么?

const Object myFunc(){
    return myObject;
}
Run Code Online (Sandbox Code Playgroud)

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

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

在这里使用const获得了什么,何时更可取?

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

Ker*_* SB 120

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

(a + b).expensive();
Run Code Online (Sandbox Code Playgroud)

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

总之,就是这种做法的理由,但它本质上是过时的.

  • @FredLarson:是的,在一本14岁的书中:-S (22认同)
  • 好吧,Herb Sutter [推荐返回const值](http://books.google.com/books?id=58rZvOSuheEC&lpg=PA179&ots=L_LgismXMo&dq=sutter%20return%20const%20value&pg=PA179#v=onepage&q&f=false)for non原始类型,但我认为你的建议现在已经过时了. (4认同)

Lig*_*ica 40

从函数返回一个值没有意义的const.

要让它对您的代码产生任何影响是很困难的:

const int foo() {
   return 3;
}

int main() {
   int x = foo();  // copies happily
   x = 4;
}
Run Code Online (Sandbox Code Playgroud)

并且:

const int foo() {
   return 3;
}

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

// error: lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)

虽然您可以注意到返回类型是否是用户定义的类型:

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
Run Code Online (Sandbox Code Playgroud)

这是否对任何人都有好处值得怀疑.

返回引用是不同的,但除非Object是某些模板参数,否则您不会这样做.

  • @IvayloToskov:你需要的所有细节都是_in_这个例子,特别是那些写着"愉快地复制"的评论.考虑`const int x = 4; int y = x;`这也很好. (3认同)

Gri*_*zly 6

它确保返回的对象(此时为RValue)不能被修改。这样可以确保用户不会这样想:

myFunc() = Object(...);
Run Code Online (Sandbox Code Playgroud)

如果myFunc通过引用返回,那将很好地工作,但是几乎可以肯定,当通过值返回时,它是一个错误(并且可能不会被编译器捕获)。当然,在C ++ 11及其右值中,此约定的意义不如早些,因为不能从const对象中移出它,因此这会对性能产生很大的影响。