3

根据我的理解,用 auto 声明的变量的类型是从它的初始化器推导出来的。

int main()
{
  unordered_map<string, int> dict;
  dict.insert({"a", 10});
  cout << dict["a"] << endl;

  auto iter = dict.find("a");
  if (iter != dict.end())
    iter->second = 30;

  cout << dict["a"] << endl;

  unordered_map<string, int>::iterator iterModify = dict.find("a");
  iterModify->second = 300;

  unordered_map<string, int>::const_iterator iterNonModify = dict.find("a");
  iterNonModify->second = 400; //  error: read-only variable is not assignable
}

在上面的例子中,正如你所看到的,auto 的类型似乎进一步受到了定义变量的使用的限制iter,它的类型是unordered_map<string, int>::iterator. 但是,如果没有以下几行,编译器如何正确推断 auto 的类型?

问题>“使用 auto 声明的变量的类型仅从其初始化程序推导出来”是真的吗?如果是这样,为什么推断的 iter 类型是unordered_map<string, int>::iterator

4

2 回答 2

3

问题>“使用 auto 声明的变量的类型仅从其初始化程序推导出来”是真的吗?

是的。编译器不会考虑您接下来将使用该变量做什么。

因此,如果您尝试编写如下代码:

auto x;
x = 5;

它不会编译,因为x声明它时没有初始化程序。

Stroustrup 自己将这个特性描述为“自动——从初始化器中推导一个类型

编辑:

如果是这样,为什么推断的 iter 类型是 unordered_map::iterator?

因为那是unordered_map.find()的返回类型,如auto iter = dict.find("a");

于 2013-06-27T02:37:06.447 回答
3

auto不同于const. 您可以定义:

const auto i = 5;
auto j = 5;
i = 6; //error const violation
j = 6; //OK

同样,您可以定义auto&, const auto&, auto&&,volatile auto等。

因为find有两个函数原型,它会根据const你在 mutable 中定义的变量的性质来选择哪一个,所以它选择了 mutable 版本。

cv-qualifier在 C++ 标准语言中, (const, volatile) 和type-specifier( auto, auto&, )是有区别的auto&&,更多细节请参见第 7.1.6 节。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

于 2013-06-27T03:09:17.953 回答