dxf*_*ldu 0 c++ initializer-list auto c++11
我知道 C++11 初始化vectorusing 的方式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;
}
Run Code Online (Sandbox Code Playgroud)
我不明白:
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 如何解释()-initialized 类型?为什么只有最后一个元素传入z并因此z仍然是 type int?为什么返回的 x 类型是 St16initializer_listIiE 而返回的 'z' 类型是 'i',使用 gcc-10 编译器。我们不应该只返回 std::initializer_list 和 'int' 吗?
typeid()不会直接给出您所期望的,它只是返回其代码中写下的特定类型标识。如果您想解密相同的内容,请通过以下方式传递c++filt:
c++filt -t St16initializer_listIiE
Run Code Online (Sandbox Code Playgroud)
它将导致您期望的结果,即:
std::initializer_list<int>
Run Code Online (Sandbox Code Playgroud)
z 上有一个警告:警告:逗号运算符的左操作数无效 [-Wunused-value]。那么结果的第二部分是:2,输入:i。c++11如何解释()初始化的类型?为什么只有最后一个元素传入 z 并且 z 仍然是 int 类型?
( )是一个包含表达式或表达式列表的初始化程序。如果您将其分配给auto,它将选择表达式列表中的最后一项作为其类型,因为它将用逗号分隔,直到最后一个表达式出现,理想情况下,它会告诉 auto 将其类型分配给最后一个。
例如:
auto x = (1, 1.5L);
Run Code Online (Sandbox Code Playgroud)
会导致长。
auto x = (1, 1.5f);
Run Code Online (Sandbox Code Playgroud)
会导致浮动。
auto x = (1, "string");
Run Code Online (Sandbox Code Playgroud)
将导致 const char 指针。
它完全忽略了( )初始化器中的第一个值,即int.