如果我有一个功能:
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()
的返回类型,在这种情况下,它是一个引用。
Foo
和Foo&
之间是否存在隐含的强制转换?
(规范参考被接受了,虽然我已经厌倦了阅读委员会发言。)
(默认情况下,第二次使用时间机器将使C ++通过引用传递。使用#pragma compatibility
触发器来编译C代码.ARGH。)
答案 0 :(得分:27)
auto
的类型推导与模板完全相同:
auto
时,您将获得值类型。auto&
时,你将得到一个非const引用类型const auto&
时,你会得到一个const引用auto&&
时,你会得到
答案 1 :(得分:13)
直接来自Herb Sutter的blog post:
自动意味着“在右侧获取完全类型,但剥离顶级const / volatile和& /&&。”