【问题标题】:How std::initializer_list Works?std::initializer_list 如何工作?
【发布时间】:2020-06-18 10:45:56
【问题描述】:

我目前正在学习 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) {}

但是它是如何工作的

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

我试过了

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

但这显示错误

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

我把 {} 改成了 () 之类的

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

这显示错误。

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

2) {} 背后是什么?

谢谢。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    std::initializer_list 很特别。不可能以同样的方式编写一个可以用作构造函数参数的类。语言规则指定 std::initializer_list 的工作方式 - 或者更确切地说,接受 std::initializer_list 的构造函数,即 initializer-list 构造函数 的工作方式。语言实现使其按规定工作。

    附:诸如_Elem 之类的标识符保留给语言实现。由于您的类 init 不是语言实现的一部分,因此使用保留标识符会导致未定义的行为。不要使用保留标识符。

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 2011-01-22
      • 2020-06-11
      • 1970-01-01
      • 2013-06-14
      • 2013-08-12
      相关资源
      最近更新 更多