自动初始化列表的类型

nht*_*rnm 2 c++ types initializer-list auto

在下面的C++代码中,什么是类型atypeid回报St16initializer_listIPKcE

auto a = { "lol", "life" };
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 5

当你有

auto a = { "lol", "life" };
Run Code Online (Sandbox Code Playgroud)

编译器将尝试推导出std::initializer_list类型是所有元素的位置.在这种情况下"lol",并"life"都是一个const char[]让你拥有std::initializer_list<const char*>.

如果在另一方面你有类似的东西

auto foo = { 1, 2.0 };
Run Code Online (Sandbox Code Playgroud)

然后,由于元素类型不同,您将遇到编译器错误.

自动推导列表的自动扣除规则如下一步

auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
auto x2 = { 1, 2.0 }; // error: cannot deduce element type
auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
Run Code Online (Sandbox Code Playgroud)

预期是在C++ 17之前

auto x5{ 3 };
Run Code Online (Sandbox Code Playgroud)

std::intializer_list<int>C++ 17中的一个地方,大多数已经采用该规则的编译器被推断为int.