C ++ auto vs auto&

时间:2013-12-30 03:23:29

标签: c++ casting reference auto

如果我有一个功能:

Foo& Bar()
{
   return /// do something to create a non-temp Foo here and return a reference to it
}

为什么会这样:

auto x = Bar(); /// probably calls copy ctor - haven't checked

与此不一样?

auto &x = Bar(); /// actually get a reference here

(实际上,我希望第二个版本能够获得对引用的引用,这没什么意义。)

如果我明确指定x的类型作为值或参考,我会得到我期望的(当然)。不过,我希望auto能够编译为Bar()的返回类型,在这种情况下,它是一个引用。

FooFoo&之间是否存在隐含的强制转换?

(规范参考被接受了,虽然我已经厌倦了阅读委员会发言。)

(默认情况下,第二次使用时间机器将使C ++通过引用传递。使用#pragma compatibility触发器来编译C代码.ARGH。)

2 个答案:

答案 0 :(得分:27)

auto的类型推导与模板完全相同:

  • 当您推断auto时,您将获得值类型。
  • 当你推导出auto&时,你将得到一个非const引用类型
  • 当你推导出const auto&时,你会得到一个const引用
  • 当你推断auto&&时,你会得到
    • 如果指定非const引用
    • ,则为非const引用
    • 如果指定const引用,则为const引用
    • 分配临时
    • 时的值

答案 1 :(得分:13)

直接来自Herb Sutter的blog post

  

自动意味着“在右侧获取完全类型,但剥离顶级const / volatile和& /&&。”