C++ C++;11自动:如果它得到一个常量引用怎么办?
请查看以下简单代码:C++ C++;11自动:如果它得到一个常量引用怎么办?,c++,reference,c++11,auto,C++,Reference,C++11,Auto,请查看以下简单代码: class Foo { public: Foo(){} ~Foo(){} Foo(const Foo&){} Foo& operator=(const Foo&) { return *this; } }; static Foo g_temp; const Foo& GetFoo() { return g_temp; } 我试着像这样使用auto: auto my_foo = GetFoo(); const auto&a
class Foo
{
public:
Foo(){}
~Foo(){}
Foo(const Foo&){}
Foo& operator=(const Foo&) { return *this; }
};
static Foo g_temp;
const Foo& GetFoo() { return g_temp; }
我试着像这样使用auto
:
auto my_foo = GetFoo();
const auto& my_foo2 = GetFoo();
auto& my_foo3 = GetFoo();
我希望my_foo
将是对foo
的常量引用,这是函数的返回类型。但是,auto
的类型是Foo
,而不是参考。此外,my\u foo
是通过复制g\u temp
创建的。这种行为对我来说并不明显
为了获得对Foo
的引用,我需要这样写:
auto my_foo = GetFoo();
const auto& my_foo2 = GetFoo();
auto& my_foo3 = GetFoo();
问题:为什么auto
将GetFoo
的返回类型推断为对象,而不是引用?阅读本文:
C++0x中自动变量的类型推断与 用于模板参数。(据我所知,唯一的区别是 两者之间的区别在于,自动变量的类型可以从 初始值设定项列表,而模板参数的类型可能不是。) 因此,以下每个声明都声明类型为的变量 int(从不常数int): 在模板参数和自动变量的类型推导过程中,仅 顶级常量将被删除。给定一个函数模板 指针或引用参数,指向的任何对象的常量 保留或提及:
如果类型是引用或指针,则可以保留cv限定符,因此可以执行以下操作:
auto& my_foo2 = GetFoo();
而不是必须将其指定为const
(这同样适用于volatile
)
<> > >编辑:< /强>至于为什么<代码> Audio/Cuff>将返回代码类型<代码> GETFoEL()/代码>作为一个值而不是引用(这是你的主要问题,对不起),考虑一下:
const Foo my_foo = GetFoo();
上面将创建一个副本,因为
my_foo
是一个值。如果auto
返回一个左值引用,上述操作就不可能了。您没有解释为什么ref限定符也会被删除。@Tomalak Geret'kal:您的意思是他们为什么决定这样做?这很有道理,不是吗?考虑这一点:<代码> FO MySoFoo= GETFoEW();和GetFoo()
没有返回常量类型。这与:auto my_foo=GetFoo()相同代码>。如果auto也包含引用,那么您将无法执行上述操作;请把它放在你的答案中。链接到Scott Meyers文章,有效的现代C++书籍奉献了整个章节来解释这一点。一个必读的VC++ 2010和英特尔C++编译器
const Foo my_foo = GetFoo();