根据我的理解,使用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
?
答案 0 :(得分:3)
问题&GT;是“用变量声明的变量的类型是真的吗? auto仅从其初始化程序中推断出“?
是。编译器没有考虑下一步使用该变量做什么。
因此,如果您尝试编写如下代码:
auto x;
x = 5;
它不会编译,因为x
在声明它时没有初始化器。
Stroustrup himself将此功能描述为“自动从初始化程序中扣除类型”
如果是这种情况,为什么推导出类型的iter unordered_map:迭代?
因为这是auto iter = dict.find("a");
答案 1 :(得分: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中定义了它,所以它选择了可变的版本。
在C ++标准语言中,cv-qualifier
(const,volatile)和type-specifier
(auto
,auto&
,auto&&
)存在差异,有关详细信息,请参阅第7.1.6节。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf