如何从`auto`变量推导出类型

时间:2013-06-27 02:22:40

标签: c++ c++11 auto

根据我的理解,使用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。但是,如果没有以下几行,编译器如何正确推断出自动类型?

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

2 个答案:

答案 0 :(得分:3)

  

问题&GT;是“用变量声明的变量的类型是真的吗?   auto仅从其初始化程序中推断出“?

是。编译器没有考虑下一步使用该变量做什么。

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

auto x;
x = 5;

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

Stroustrup himself将此功能描述为“自动从初始化程序中扣除类型

编辑:

  

如果是这种情况,为什么推导出类型的iter   unordered_map:迭代?

因为这是auto iter = dict.find("a");

中的unordered_map.find()的返回类型

答案 1 :(得分:3)

autoconst不同。您可以定义:

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

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

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

在C ++标准语言中,cv-qualifier(const,volatile)和type-specifierautoauto&auto&&)存在差异,有关详细信息,请参阅第7.1.6节。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf