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();