我目前正在学习 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) {}
Run Code Online (Sandbox Code Playgroud)
但它是如何工作的
std::initializer_list<int> v{1,2,3,4,5,6,7,8,9,0};
Run Code Online (Sandbox Code Playgroud)
我试过这个
constexpr init(const _Elem* _First_arg, const _Elem* _Last_arg) noexcept
: _First(_First_arg), _Last(_Last_arg) {}
Run Code Online (Sandbox Code Playgroud)
但这显示错误
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
Run Code Online (Sandbox Code Playgroud)
我把 {} 改为 () 就像
std::initializer_list<int> v(1,2,3,4,5,6,7,8,9,0);
Run Code Online (Sandbox Code Playgroud)
这显示错误。
1) std::initializer_list 如何工作?
2) {} 背后是什么?
谢谢。
std::initializer_list很特别。不可能以相同的方式编写一个可以用作构造函数参数的类。语言规则指定了如何std::initializer_list工作 - 或者更确切地说,接受std::initializer_list即初始化列表构造函数的构造函数如何工作。语言实现使其按规定工作。
PS 诸如此类的标识符_Elem保留给语言实现。由于您的类init不是语言实现的一部分,因此使用保留标识符会导致未定义的行为。不要使用保留标识符。