[我知道C ++ 11使用vector
初始化auto
的方式,实际上是初始化了std::initializer_list
而不是vector
。但是,给出下面的代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
auto x = {1, 2};
cout << typeid(x).name() << endl;
auto z = (1, 2);
cout << z << ", type: " << typeid(z).name() << endl;
return 0;
}
我不明白:
x
的类型为St16initializer_listIiE
,而返回的'z'的类型为'i'。我们不应该只返回std::initializer_list
和'int'吗?z
上有警告:warning: left operand of comma operator has no effect [-Wunused-value]
。那么结果的后一半是:2, type: i
。 c ++ 11如何解释()
初始化的类型?为什么只有最后一个元素传递到z
中,因此z
仍然是int
类型? 构成初始化列表的唯一内容是{}
。在
auto z = (1, 2);
您所拥有的是逗号运算符,它仅返回最后一个值。因此,这意味着您的代码可以归结为
auto z = 2;
并且由于2
是int
,所以z
是int
。
因为{ 1, 2 }
是std::initializer_list<int>
,但是(1, 2)
是一个表达式,它扩展为逗号运算符(它计算两个参数并返回第二个参数,因此(1, 2)
折叠为[ C0],它折叠为(2)
。这就是为什么2
计算为整数初始化的原因。
因为只忽略了指令auto z = (1, 2);
的结果(请记住1
计算两个表达式并丢弃第一个表达式的结果。