std::initializer_list 私有构造函数是否从编译器得到非常特殊的对待?
Does std::initializer_list private constructor get very special treatment from compiler?
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 是否有一些内部功能可用于公开任何 class 的任何私有成员?
(我好像是 relevant question,但它只提到
However, initializer_list is a type that depends on some magic
being done by the compiler. By magic, I'm referring to §8.5.4/5 that
you've quoted.
这实际上并没有解释编译器是如何做到的。我的问题不是关于我是否可以在我的代码中调用该构造函数,或者标准中允许它的内容,而是 gcc 如何在内部设法看到在这种情况下可以调用私有构造函数。)
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
对象的第一个字段中,并将大小存储到第二个字段中。
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 是否有一些内部功能可用于公开任何 class 的任何私有成员?
(我好像是 relevant question,但它只提到
However, initializer_list is a type that depends on some magic being done by the compiler. By magic, I'm referring to §8.5.4/5 that you've quoted.
这实际上并没有解释编译器是如何做到的。我的问题不是关于我是否可以在我的代码中调用该构造函数,或者标准中允许它的内容,而是 gcc 如何在内部设法看到在这种情况下可以调用私有构造函数。)
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
对象的第一个字段中,并将大小存储到第二个字段中。