创建局部变量时,使用(const) auto&或auto正确吗
例如:
SomeClass object;
const auto result = object.SomeMethod();或const auto& result = object.SomeMethod();
其中SomeMethod()返回一个非原始值--可能是另一个用户定义的类型。我的理解是const auto& result是正确的,因为SomeMethod()返回的结果将调用返回类型的复制构造函数。如果我错了,请纠正我。
那么对于原始类型呢?我假设const auto sum = 1 + 2;是正确的。
这也适用于基于范围的for循环吗?
for(const auto& object : objects)发布于 2015-04-25 09:45:31
auto和auto &&涵盖了大多数情况:
当您需要本地副本时,
auto。这永远不会产生引用。复制(或移动)构造函数必须存在,但由于复制省略优化,它可能不会被调用。当您不关心对象是否是本地对象时,
auto &&。从技术上讲,这总是会产生一个引用,但如果初始化器是临时的(例如,函数通过值返回),它的行为本质上就像你自己的本地对象。而且,auto &&也不能保证对象是可修改的。给定一个const对象或引用,它将推导出const。但是,考虑到特定的上下文,通常假定可修改性。
auto &和auto const &更具体一些:
auto &保证您正在与其他对象共享该变量。它始终是一个引用,永远不会指向临时的。auto const &类似于auto &&,但提供只读访问。对于基元/非基元类型呢?
这是没有区别的。
这也适用于基于范围的for循环吗?
是。应用上述原则,
auto &&来修改和丢弃循环中序列的值。(也就是说,除非容器提供只读视图,例如std::initializer_list,在这种情况下,它实际上是一个auto const &.)auto &,用于以有意义的方式修改序列的值。auto const &进行只读访问。auto处理(可修改的)副本。您还提到了auto const,但没有引用。这是可行的,但不是很常用,因为对您已经拥有的东西进行只读访问很少有好处。
发布于 2015-04-25 09:14:55
是的,对局部变量使用auto和auto&是正确的。在获取函数的返回类型时,使用auto&也是正确的。这也适用于基于范围的for循环。
使用auto的一般规则如下:
当您想要处理副本时,
auto x。auto &x。auto const &x。您可以阅读有关自动说明符here的更多信息。
发布于 2015-04-25 09:32:10
auto使用与模板相同的类型推导机制,据我所知唯一的例外是大括号初始化列表,它被auto推导为std::initializer_list,但在模板上下文中不是推导出来的。
auto x = expression;首先从右侧表达式的类型中剥离所有引用和cv限定符,然后匹配该类型。例如,如果您有const int& f(){...},则auto x = f();将x推导为int,而不是 const int&。
另一种形式,
auto& x = expression没有剥离的cv限定符,因此,使用上面的示例,auto& x = f()将x推断为const int&。其他的组合只是添加了cv限定符。
如果您希望始终使用cv-ref限定符推导出您的类型,请使用C++14中臭名昭著的decltype(auto),它使用decltype类型推导规则。
所以,简而言之,如果你想要拷贝,使用auto,如果你想引用,使用auto&。只要您需要额外的const-ness,就可以使用const。
编辑还有一个额外用例,
auto&& x = expression;它使用引用折叠规则,与模板代码中转发引用的情况相同。如果expression是一个左值,那么x就是一个带有expression的cv限定符的左值引用。如果expression是右值,则x是右值引用。
https://stackoverflow.com/questions/29859796
复制相似问题