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

Does std::initializer_list private constructor get very special treatment from compiler?

本文关键字:那里 非常 处理 编译器 list initializer 是否 构造函数 std      更新时间:2023-10-16

GCC 的 libstdc++ 的 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 是否具有一些可用于公开任何类的任何私有成员的内部功能?

(我似乎是相关的问题,但它只提到

然而,initializer_list是一种依赖于某种魔法的类型 由编译器完成。通过魔法,我指的是§8.5.4/5 你已经引用了。

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

GCC的C++前端实际上并不使用该私有构造函数。它根本不使用构造函数:

/* 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对象的第一个字段中,并将大小存储到第二个字段中。