简体   繁体   English

std::initializer_list 如何工作?

[英]How std::initializer_list Works?

I am currently studying c++11 i did not understand constructor of std::initializer_list it looks like this我目前正在研究 c++11 我不明白 std::initializer_list 的构造函数它看起来像这样

constexpr initializer_list() noexcept : _First(nullptr), _Last(nullptr) {}

constexpr initializer_list(const _Elem* _First_arg, const _Elem* _Last_arg) noexcept
    : _First(_First_arg), _Last(_Last_arg) {}

But How it works with但它是如何工作的

std::initializer_list<int> v{1,2,3,4,5,6,7,8,9,0};

and i tried this我试过这个

constexpr init(const _Elem* _First_arg, const _Elem* _Last_arg) noexcept
    : _First(_First_arg), _Last(_Last_arg) {}

but this shows error但这显示错误

init<int> ob{1,2,3,4,5,6,7,8,9,0}; //this shows error

 note: candidate: 'constexpr init<_Elem>::init(const _Elem*, const _Elem*) [with _Elem = int]'
 constexpr init(const _Elem* _First_arg, const _Elem* _Last_arg) noexcept
           ^~~~
 note:   candidate expects 2 arguments, 10 provided

and i changed {} to () like我将 {} 更改为 () 喜欢

std::initializer_list<int> v(1,2,3,4,5,6,7,8,9,0);

This shows error.这显示错误。

1)How std::initializer_list works? 1)std::initializer_list 是如何工作的?

2)What is behind {}? 2) {} 后面是什么?

Thanks.谢谢。

std::initializer_list is special. std::initializer_list是特殊的。 It is impossible to write a class that could be used as a constructor argument in the same way.不可能以相同的方式编写可以用作构造函数参数的 class。 The language rules specify how std::initializer_list works - or rather, how constructors that accept std::initializer_list ie initializer-list constructors work.语言规则指定std::initializer_list如何工作 - 或者更确切地说,接受std::initializer_list的构造函数,即初始化列表构造函数如何工作。 And the language implementation makes it work as specified.语言实现使其按规定工作。

PS Identifiers such as _Elem are reserved to the language implementation. PS 标识符(例如_Elem )保留给语言实现。 Since your class init is not part of the language implementation, using reserved identifiers results in undefined behaviour.由于您的 class init不是语言实现的一部分,因此使用保留标识符会导致未定义的行为。 Don't use reserved identifiers.不要使用保留的标识符。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM