82

请看下面的简单代码:

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

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

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

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

4

1 回答 1

67

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


C++0x 中自动变量的类型推导与模板参数的类型推导基本相同。(据我所知,两者的唯一区别是自动变量的类型可以从初始化列表中推导出来,而模板参数的类型可能不是。)因此,以下每个声明都声明了 int 类型的变量(从不 const int):

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

在模板参数和自动变量的类型推导期间,仅删除顶级 const。给定一个带有指针或引用参数的函数模板,任何被指向或引用的东西的常量都会被保留:

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++03。当然,自动变量的相应行为对于 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)。

编辑:至于为什么auto将返回类型推断GetFoo()为值而不是引用(这是您的主要问题,抱歉),请考虑以下问题:

const Foo my_foo = GetFoo();

以上将创建一个副本,因为my_foo它是一个值。如果auto要返回左值引用,则上述内容将是不可能的。

于 2011-08-21T14:00:24.030 回答