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

我预计my_foo将是一个常量引用Foo ,这是函数的返回types。 但是, auto的types是Foo ,而不是参考。 而且,通过复制g_temp来创buildmy_foo 。 这种行为对我来说并不明显。

为了得到对Foo的引用,我需要这样写:

 const auto& my_foo2 = GetFoo(); auto& my_foo3 = GetFoo(); 

问题 :为什么auto GetFoo的返回types作为一个对象进行推导,而不是引用?

阅读这篇文章: 在C ++中出现和消失常量


C ++ 0x中的自动variables的types推导与模板参数基本相同。 (据我所知,两者之间的唯一区别是自动variables的types可以从初始值列表中推导出来,而模板参数的types可能不是)。下面的每个声明都声明了inttypes的variables从来没有const int):

 auto a1 = i; auto a2 = ci; auto a3 = *pci; auto a4 = pcs->i; 

在为模板参数和自动variables进行types推导的过程中,只有顶级常量被删除。 给定一个带指针或引用参数的函数模板,保留任何指向或引用的常量。

 template<typename T> void f(T& p); int i; const int ci = 0; const int *pci = &i; f(i); // as before, calls f<int>, ie, T is int f(ci); // now calls f<const int>, ie, T is const int f(*pci); // also calls f<const int>, ie, T is const int 

这个行为是旧的新闻,它应用于C ++ 98和C ++ 03。 自动variables的相应行为当然是C ++ 0x的新特性:

 auto& a1 = i; // a1 is of type int& auto& a2 = ci; // a2 is of type const int& auto& a3 = *pci; // a3 is also of type const int& auto& a4 = pcs->i; // a4 is of type const int&, too 

因为如果types是引用或指针,你可以保留cv-qualifier,你可以这样做:

 auto& my_foo2 = GetFoo(); 

而不必将其指定为const (同样适用于volatile )。

编辑:至于为什么auto推导GetFoo()的返回types作为一个值而不是引用(这是你的主要问题,抱歉),请考虑这一点:

 const Foo my_foo = GetFoo(); 

以上将创build一个副本,因为my_foo是一个值。 如果auto返回一个左值引用,上面的将不可能。