【问题标题】:How type is deduced from `auto` variable如何从 `auto` 变量推断类型
【发布时间】:2013-06-27 02:22:39
【问题描述】:

根据我的理解,用 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&lt;string, int&gt;::iterator。但是,如果没有以下几行,编译器如何正确推断 auto 的类型?

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

【问题讨论】:

  • 如果没有以下几行,您认为该类型会是什么?

标签: c++ c++11 auto


【解决方案1】:

autoconst 不同。你可以定义:

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

同样,你可以定义auto&amp;const auto&amp;auto&amp;&amp;volatile auto

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

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

【讨论】:

    【解决方案2】:

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

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

    因此,如果您尝试编写这样的代码:

    auto x;
    x = 5;
    

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

    Stroustrup himself 将此功能描述为“auto -- 从初始化器中推导类型

    编辑:

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

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

    【讨论】:

    • 这并没有解决我的问题。请查看我更新的问题。
    • 这与我在回答中提供的链接完全相同,以支持我所说的事实......
    • @q0987 这个答案到底有什么问题?它似乎提供了您要求的所有信息。 (不过,如果它有对标准的引用会更好..)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多