为什么`std :: initializer_list`没有提供下标运算符?

时间:2013-07-22 12:18:40

标签: c++ c++11 iterator operator-overloading initializer-list

假设您正在编写一个接受名为std::initializer_list的{​​{1}}的函数,并且该函数需要随机访问list的元素。写list代替list[i]会很方便。那么为什么list.begin()[i]没有提供std::initializer_list的定义?

我无法想到任何operator[]返回operator[]的定义不明确的情况。效率似乎不是问题,因为const T&别名为std::initializer_list<T>::iterator,显然是随机访问迭代器。

1 个答案:

答案 0 :(得分:11)

根据Bjarne Stroustrup在C ++编程语言第17版第17.3.4.2节(第497页)中的说明:

  

不幸的是,initializer_list不提供下标。

没有进一步的理由。

我的猜测是,这是其中一个原因:

  1. 这是一个遗漏,或
  2. 因为initializer_list类是用数组实现的,你必须进行边界检查以提供安全访问,如果提供了该接口,它可能更容易被不安全地使用,或者
  3. 与std算法迭代范例一致,或
  4. 因为初始化列表本质上是临时的,所以通过直接解决它们会有更多的错误空间
  5. 2和4听起来有点弱。我的钱是1。