如何在C++中使用const和const?

use*_*422 22 c++ c++11

我有一个返回const A&的方法.

如果我想使用auto,那么正确的方法是什么.这个可以吗?

const auto &items = someObject.someMethod();
Run Code Online (Sandbox Code Playgroud)

我看到有些人这样做:

auto &items = someObject.someMethod();
Run Code Online (Sandbox Code Playgroud)

我不确定使用哪一个,真的有什么区别......

编辑:

在这种情况下,这两个是等价的吗?

auto items = someObject.someMethod();
auto &items = someObject.someMethod();
Run Code Online (Sandbox Code Playgroud)

And*_*owl 14

即使这两种形式在这种情况下是等价的,我仍然会选择第一种形式,因为它更好地传达了这样一个事实:你的代码片段不需要修改返回的对象的状态someMethod().

所以我的建议就是这样做:

const auto &items = someObject.someMethod();
Run Code Online (Sandbox Code Playgroud)

  • @ user2381422:不,他们不是.但是请记住,在人们对旧问题作出回应后1小时更改问题或添加新问题并不是一种非常适合使用SO的方法.只要有一篇文章回答你的原始问题,你就应该接受它.如果你有一个新问题,请问一个新问题:) - 如果两者相关,可能会将它与旧问题联系起来. (7认同)
  • @ robson3.14我想这会让解析C++代码变得更加疯狂. (2认同)

Rei*_*ica 8

在你的情况下,没有区别.该类型auto表示将被推断为const A在两种情况下,这样的类型items将是const A&.

代码的"自我记录的语义"有所不同.在const auto &明确指出"我想回到什么样的参考,我不会改变它." 只是auto &简单地说"我想要一个对返回内容的引用".

  • 如果*not*明确存在,则推导出`const`. (2认同)

Pot*_*ter 8

更明确的通常是更好的,例外是关注点的分离.不应在接口的客户端提及实现细节.

如果接收器不应该关心如何接收对象,那么完美的转发是可行的方法.

auto && items = someObject.someMethod();
Run Code Online (Sandbox Code Playgroud)

允许const推断auto,例如,绑定一个临时值,auto &对我来说是一个主要的代码味道.

  • auto const & 应该是只读的
  • auto & 应该是读写
  • auto && 应该意味着抓住所有,也许采用价值回报对象