std::initializer_list私有构造函数是否从编译器那里得到非常特殊的处理
Does std::initializer_list private constructor get very special treatment from compiler?
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
对象的第一个字段中,并将大小存储到第二个字段中。
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- OpenGL大的3D纹理(>2GB)非常慢
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 如何从用户那里获取输入并将其存储在向量中?
- 使用浮点数和双精度数的非常小数字的数学
- 在打开多个其他窗口时使用全屏窗口时帧速率非常低
- 我从int x[3]得到的一个非常奇怪的输出;
- 反向迭代器在C++中非常奇怪的行为
- 从用户那里获取数组大小的值
- C++ deque 消费者总是从生产者那里得到空队列
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 我的自定义使用 std::unordered_map 的性能非常慢
- ifstream 尝试读取 9 到 13 之间的无符号字符时非常奇怪的行为
- 代码在执行之前终止,并且没有从用户那里获取输入
- 一个非常简单的win32套接字代码,但工作错误
- 我无法在某个点(从用户那里)获得输入,即使没有错误弹出编译
- std::initializer_list私有构造函数是否从编译器那里得到非常特殊的处理