std :: initializer_list私有构造函数是否从编译器获得非常特殊的处理?

时间:2017-10-31 19:14:56

标签: c++ gcc libstdc++

GCC的libstdc ++的source code for std::initializer_list有以下部分:

private:
  iterator                  _M_array;
  size_type                 _M_len;

  // The compiler can call a private constructor.
  constexpr initializer_list(const_iterator __a, size_type __l)
  : _M_array(__a), _M_len(__l) { }

这是如何发生的?调用std::initializer_list的私有构造函数是否将特殊异常硬编码到编译器代码中?或者GCC是否有一些内部功能可以用于暴露任何类的任何私有成员?

(我似乎是relevant question,但它只提到

  

但是,initializer_list是一种取决于某些魔法的类型   由编译器完成。通过魔术,我指的是§8.5.4/ 5   你引用了。

实际上没有解释编译器是如何做到的。我的问题不是关于我是否可以在我的代码中调用该构造函数,或者标准中允许的是什么,而是内部gcc如何设法看到在这种情况下可以调用私有构造函数。)

1 个答案:

答案 0 :(得分:1)

GCC的C ++前端实际上并没有使用私有构造函数。 It uses no constructor at all

/* Build up the initializer_list object.  */
totype = complete_type (totype);
field = next_initializable_field (TYPE_FIELDS (totype));
CONSTRUCTOR_APPEND_ELT (vec, field, array);
field = next_initializable_field (DECL_CHAIN (field));
CONSTRUCTOR_APPEND_ELT (vec, field, size_int (len));
new_ctor = build_constructor (totype, vec);

这实际上发出的代码只是将指针存储到initializer_list对象的第一个字段中,而将大小存储到第二个字段中。