什么是Curly-Brace附上列表如果不是intializer_list?

Jon*_*Mee 31 c++ initialization initializer curly-braces initializer-list

我在这里问了一个问题:涉及非功能代码的initializer_list返回的生命周期扩展:

const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };
Run Code Online (Sandbox Code Playgroud)

我相信lambda试图回归intializer_list(这很糟糕,不要这样做.)但我得到了一个评论:

它不是一个initializer_list,它是一个初始化列表.两件不同的事情.

我只是认为,无论何时你做了一个花括号列表,你都在创建一个intializer_list.如果那不是正在发生的事情,花括号中的列表是什么?

Nat*_*ica 29

它是一个braced-init-list.一个支撑-初始化列表之前就已经存在std::initializer_list,并用于初始化一个集合.

int arr[] = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

上面使用了一个braced-init-list来初始化数组,没有std::initializer_list创建.另一方面,当你这样做

std::vector<int> foo = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

foo不是聚合,所以braced-init-list用于创建一个std::initializer_list转向传递给foo接受a 的构造函数的std::initializer_list.

有关braced-init-list的注意事项是没有类型,因此开发了与它一起使用的特殊规则auto.它具有以下行为(自N3922采用以来)

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>
auto x5{ 3 }; // decltype(x5) is int
Run Code Online (Sandbox Code Playgroud)

并且您可以获得有关此行为的历史记录以及更改原因的更多信息:为什么auto x {3}推断出initializer_list?


Tar*_*ama 12

这里有三个不同但相关的概念:

  1. braced-init-list:在某些上下文中与大括号括起的列表相关联的语法规则.

  2. 初始化列表:列表初始化中使用的braced-init-list初始化程序的名称.

  3. std::initializer_list:包含临时数组的类,该数组在某些涉及braced-init-list的上下文中创建.

一些例子:

//a braced-init-list and initializer list, 
//but doesn't create a std::initializer_list
int a {4}; 

//a braced-init-list and initializer list,
//creates a std::initializer_list
std::vector b {1, 2, 3};

//a braced-init-list and initializer list,
//does not create a std::initializer_list (aggregate initialization)
int c[] = {1, 2, 3};

//d is a std::initializer_list created from an initializer list
std::initializer_list d {1, 2, 3};

//e is std::initializer_list<int>
auto e = { 4 };

//f used to be a std::initializer_list<int>, but is now int after N3922
auto f { 4 };
Run Code Online (Sandbox Code Playgroud)

您可能想要阅读N3922,它改变了一些涉及auto和的规则std::initializer_list.


R S*_*ahu 7

我只是认为,无论何时你做了一个花括号列表,你都在创建一个intializer_list.

那不对.

如果那不是正在发生的事情,花括号中的列表是什么?

struct Foo {int a; int b;};
Foo f = {10, 20};
Run Code Online (Sandbox Code Playgroud)

{10, 20}部分不是initializer_list.它只是一种使用对象列表来创建另一个对象的语法形式.

int a[] = {10, 20, 30};
Run Code Online (Sandbox Code Playgroud)

再一次,它是一种创建数组的语法形式.

句法形式的名称是braced-init-list.