C + + auto & vs auto

在创建局部变量时,使用 (const) auto&auto是否正确?

例如:

SomeClass object;
const auto result = object.SomeMethod();

or const auto& result = object.SomeMethod();

其中,somMethod ()返回一个非基元值-也许是另一个用户定义类型。 我的理解是 const auto& result是正确的,因为 somMethod ()返回的结果会调用返回类型的复制建构子。如果我说错了,请纠正我。

那么对于基本类型呢? 我假设 const auto sum = 1 + 2;是正确的。

这也适用于基于循环的范围吗?

for(const auto& object : objects)
101311 次浏览

是的,对局部变量使用 autoauto&是正确的。 当获取函数的返回类型时,使用 auto&也是正确的。这也适用于基于循环的范围。

General rules for using auto are:

  • 如果要处理副本,请选择 auto x
  • 当您想处理原始项目并可能修改它们时,请选择 auto &x
  • 当您想使用原始项目时,请选择 auto const &x 而不是修改它们。

您可以阅读有关自动说明符 here的更多信息。

auto使用与模板相同的类型推导机制,我知道的唯一例外是大括号初始化列表,它们由 auto作为 std::initializer_list推导出来,但在模板上下文中没有推导出来。

auto x = expression;

首先从右侧表达式的类型中剥离所有引用和 cv 限定符,然后匹配类型。例如,如果有 const int& f(){...},那么 auto x = f();推导出 xint,而 没有const int&

另一种形式,

auto& x = expression

不带 cv 限定符,因此,使用上面的示例,auto& x = f()x推断为 const int&。其他组合只是添加 cv 限定符。

如果希望总是使用 cv-ref 限定符推导类型,请使用 C + + 14中臭名昭著的 decltype(auto),它使用 decltype类型推导规则。

So, in a nutshell, if you want copies, use auto, if you want references, use auto&. Use const whenever you want additional const-ness.


剪辑 还有一个额外的用例,

auto&& x = expression;

它使用引用折叠规则,与在模板代码中转发引用的情况相同。如果 expression是左值,那么 x是带有 expression的 cv 限定符的左值引用。如果 expression是一个右值,那么 x就是一个右值引用。

autoauto &&涵盖了大多数病例:

  • 如果需要本地副本,请使用 auto。这永远不会产生一个参考。复制(或移动)构造函数必须存在,但由于 copy elision优化,它可能不会被调用。

  • 当您不关心对象是否是本地的时候,请使用 auto &&。从技术上讲,这将始终产生一个引用,但是如果初始化程序是临时的(例如,函数通过值返回) ,它的行为基本上就像您自己的本地对象。

    而且,auto &&也不能保证对象是可修改的。给定一个 const对象或引用,它将推导出 const。然而,考虑到特定的上下文,可修改性通常是假定的。

auto &auto const &更具体一些:

  • auto &保证您正在与其他东西共享变量。它总是一个参考,从来没有一个临时的。

  • auto const &类似于 auto &&,但提供只读访问。

那么对于原语/非原语类型呢?

There is no difference.

这也适用于基于循环的范围吗?

是的,运用上述原则,

  • 使用 auto &&可以修改和丢弃循环中序列的值。(也就是说,除非容器提供只读视图,如 std::initializer_list,在这种情况下它实际上是 auto const &。)
  • 使用 auto &以有意义的方式修改序列的值。
  • 使用 auto const &进行只读访问。
  • 使用 auto处理(可修改的)副本。

你也没有提到 auto const。这很有用,但是并不常用,因为只读访问您已经拥有的内容几乎没有什么好处。

When creating local variables, is it correct to use (const) auto& or auto?

是的。Auto 只不过是编译器推导的类型,所以在通常使用引用的地方使用引用,在通常使用本地副本的地方使用本地(自动)副本。是否使用引用与类型推导无关。

其中,somMethod ()返回一个非基元值-也许是另一个用户定义类型。我的理解是 const auto & result 是正确的,因为 somMethod ()返回的结果会调用返回类型的复制建构子。如果我说错了,请纠正我。

合法?是的,用常数。最佳实践?应该不会。至少 C + + 11不会。特别是,如果从 SomMethod ()返回的值已经是临时的,那么就更不能。你会想了解 c + + 11 move 语义、复制省略和返回值优化: Https://juanchopanzacpp.wordpress.com/2014/05/11/want-speed-dont-always-pass-by-value/

Http://www.informit.com/guides/content.aspx?g=cplusplus&seqnum=199

Https://isocpp.org/wiki/faq/ctors#return-by-value-optimization

那么对于基元类型呢? 我假设 const auto sum = 1 + 2; 是正确的。

是的,这很好。

这也适用于基于循环的范围吗?

For (const auto & object: object)

是的,这也很好。我一直在工作中编写这种代码。