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
返回一个左值引用,上面的将不可能。