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的常量引用,Foo是函数的返回类型。但是,auto的类型是 Foo,而不是引用。此外,my_foo是通过复制 g_temp创建的。这种行为对我来说没那么明显。

为了获得对 Foo的参考,我需要这样写:

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

问题 : 为什么 auto推断 GetFoo的返回类型是一个对象,而不是一个引用?

38036 次浏览

阅读这篇文章: C + + 中常量的显示和消失


C + + 0x 中自动变量的类型演绎与 模板参数。(据我所知,唯一的区别 两者之间的区别在于自动变量的类型可以从 初始化程序列表,而模板参数的类型可能不是。) 因此,下列每个声明都声明了类型为 Int (never const int) :

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

在模板参数和自动变量的类型演绎期间,仅 顶级常量被删除 指针或引用参数,指向的任何东西的常量 保留:

template<typename T>
void f(T& p);


int i;
const int ci = 0;
const int *pci = &i;


f(i);               // as before, calls f<int>, i.e., T is int
f(ci);              // now calls f<const int>, i.e., T is const int
f(*pci);            // also calls f<const int>, i.e., T is const int

这种行为已经是老生常谈了,因为它既适用于 C + + 98,也适用于 自动变量的对应行为当然是, 新到 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

因为如果类型是引用或指针,你可以保留 cv 限定符,你可以这样做:

auto& my_foo2 = GetFoo();

而不必将其指定为 const(对于 volatile也是如此)。

编辑: 至于为什么 autoGetFoo()的返回类型作为一个值而不是一个引用(这是你的主要问题,抱歉) ,考虑一下:

const Foo my_foo = GetFoo();

上面的代码将创建一个副本,因为 my_foo是一个值。如果 auto返回一个左值引用,上述操作就不可能实现。