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
这里有三个不同但相关的概念:
braced-init-list:在某些上下文中与大括号括起的列表相关联的语法规则.
初始化列表:列表初始化中使用的braced-init-list初始化程序的名称.
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
.
我只是认为,无论何时你做了一个花括号列表,你都在创建一个
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
.
归档时间: |
|
查看次数: |
1349 次 |
最近记录: |