阅读这篇文章:在 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
要返回左值引用,则上述内容将是不可能的。