首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ auto vs auto

C++ auto vs auto
EN

Stack Overflow用户
提问于 2015-04-25 08:58:25
回答 4查看 79.7K关注 0票数 101

创建局部变量时,使用(const) auto&auto正确吗

例如:

代码语言:javascript
运行
复制
SomeClass object;
const auto result = object.SomeMethod();

const auto& result = object.SomeMethod();

其中SomeMethod()返回一个非原始值--可能是另一个用户定义的类型。我的理解是const auto& result是正确的,因为SomeMethod()返回的结果将调用返回类型的复制构造函数。如果我错了,请纠正我。

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

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

代码语言:javascript
运行
复制
for(const auto& object : objects)
EN

回答 4

Stack Overflow用户

发布于 2015-04-25 09:45:31

autoauto &&涵盖了大多数情况:

当您需要本地副本时,

  • 可以使用auto。这永远不会产生引用。复制(或移动)构造函数必须存在,但由于复制省略优化,它可能不会被调用。

当您不关心对象是否是本地对象时,

  • 会使用auto &&。从技术上讲,这总是会产生一个引用,但如果初始化器是临时的(例如,函数通过值返回),它的行为本质上就像你自己的本地对象。

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

auto &auto const &更具体一些:

  • auto &保证您正在与其他对象共享该变量。它始终是一个引用,永远不会指向临时的。

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

对于基元/非基元类型呢?

这是没有区别的。

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

是。应用上述原则,

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

您还提到了auto const,但没有引用。这是可行的,但不是很常用,因为对您已经拥有的东西进行只读访问很少有好处。

票数 123
EN

Stack Overflow用户

发布于 2015-04-25 09:14:55

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

使用auto的一般规则如下:

当您想要处理副本时,

  • 选择auto x
  • 当您要处理原始项目并可能对其进行修改时,请选择auto &x
  • 如果您要处理原始项目且不会对其进行修改,请选择auto const &x

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

票数 58
EN

Stack Overflow用户

发布于 2015-04-25 09:32:10

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

代码语言:javascript
运行
复制
auto x = expression;

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

另一种形式,

代码语言:javascript
运行
复制
auto& x = expression

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

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

所以,简而言之,如果你想要拷贝,使用auto,如果你想引用,使用auto&。只要您需要额外的const-ness,就可以使用const

编辑还有一个额外用例,

代码语言:javascript
运行
复制
auto&& x = expression;

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29859796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档