[英]C++11: how does auto deal with () initializer?
我知道 C++11 使用auto
初始化vector
的方式,实际上是初始化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',使用 gcc-10 编译器。 我们不应该只返回std::initializer_list
和 'int' 吗?z
上有一个警告: warning: left operand of comma operator has no effect [-Wunused-value]
。 然后结果的第二半是: 2, type: i
。 c++11 如何解释()
- 初始化类型? 为什么只有最后一个元素传递给z
,因此z
仍然是int
类型?为什么返回的 x 的类型是 St16initializer_listIiE 而返回的 'z' 的类型是 'i',使用 gcc-10 编译器。 我们不应该只返回 std::initializer_list 和 'int' 吗?
typeid()
不会直接给出您所期望的,它只是返回其代码中写下的特定类型标识。 如果您想解密相同的内容,请通过c++filt
传递它:
c++filt -t St16initializer_listIiE
它将产生您所期望的结果,即:
std::initializer_list<int>
z 上有警告:警告:逗号运算符的左操作数无效 [-Wunused-value]。 然后结果的第二半是:2,输入:i。 c++11如何解释()初始化的类型? 为什么只有最后一个元素传递到 z 中,因此 z 仍然是 int 类型?
( )
是一个包含表达式或表达式列表的初始值设定项。 如果要将其分配给auto
,它将 select 表达式列表中的最后一项作为其类型,因为它将用逗号分隔,直到最后一个表达式出现,理想情况下告诉 auto 将其类型分配给最后一个.
例如:
auto x = (1, 1.5L);
会导致很长。
auto x = (1, 1.5f);
会导致浮动。
auto x = (1, "string");
将产生一个 const char 指针。
它完全忽略了( )
初始化程序中的第一个值,即int
。
唯一构成初始化列表的是{}
。 在
auto z = (1, 2);
你所拥有的是逗号运算符,它只返回最后一个值。 所以这意味着你的代码归结为
auto z = 2;
因为2
是int
,所以z
是int
。
因为{ 1, 2 }
是一个std::initializer_list<int>
,但(1, 2)
是一个表达式,它扩展为逗号运算符(它同时计算 arguments 并返回第二个结果,所以(1, 2)
被折叠成(2)
,它被折叠成2
。这就是为什么auto z = (1, 2);
评估为 integer 初始化的原因。
因为指令1
的结果被简单地忽略(记住(1, 2)
计算两个表达式并丢弃第一个的结果)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.