22

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

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

const auto &items = someObject.someMethod();

我看到有些人这样做:

auto &items = someObject.someMethod();

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

编辑:

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

auto items = someObject.someMethod();
auto &items = someObject.someMethod();
4

3 回答 3

15

即使在这种情况下这两种形式是等价的,我还是会选择第一种形式,因为它更好地传达了这样一个事实,即您的代码段不需要修改由someMethod().

所以我的建议是这样做:

const auto &items = someObject.someMethod();
于 2013-05-29T09:20:09.790 回答
8

在你的情况下,没有区别。auto在这两种情况下都将推导出表示的类型const A,因此类型items将是const A&

代码的“自我记录语义”是不同的。明确指出“const auto &我想要参考返回的内容,我不会修改它。” 只是auto &简单地说“我想要参考返回的内容”。

于 2013-05-29T09:18:44.297 回答
8

更明确通常更好,除了关注点分离。接口的客户端不应提及实现细节。

如果接收者不应该关心对象是如何被接收的,那么完美的转发就是要走的路。

auto && items = someObject.someMethod();

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

  • auto const &应该是只读的
  • auto &应该是读写的意思
  • auto &&应该意味着全部捕获,也许采用按值对象返回
于 2013-05-29T09:37:43.923 回答