【发布时间】:2020-04-28 09:16:24
【问题描述】:
一边阅读标准构造函数[variant.ctor]的定义:
template<class T> constexpr variant(T&& t) noexcept(see below);
我遇到了一个模糊的限制:
让
Tj是一个类型,确定如下:为每个替代类型Ti构建一个假想函数TiTi x[] = {std::forward<T>(t)};对于某些发明的变量x是格式良好的 ...他为表达式FUN(std::forward<T>(t))的重载解析选择的重载FUN(Tj)定义了替代Tj,这是构造后包含的值的类型。
我想了解这个限制背后的意图是什么:
对于哪个
Ti x[] = {std::forward<T>(t)};格式正确?
如果没有这个限制,重载解析将消除所有无法通过复制初始化初始化参数的重载。
据我所知,Ti x[] = {std::forward<T>(t)} 应该落在[dcl.init.aggr]/2:
否则,元素从相应的初始化子句复制初始化,或者使用相应的指定初始化子句的大括号或相等初始化子初始化。如果该初始值设定项的形式为 assignment-expression 或 = assignment-expression,并且需要一个窄化转换 ([dcl.init.list]) 来转换该表达式,则该程序是非良构的。
所以我看到这个限制从重载的虚函数集中删除了那些在调用时会涉及缩小转换的函数。但也许还有更多?我错了吗?为什么在限制中进行数组初始化,为什么不Ti x = {std::forward<T>(t)}? “Ti x[] = {std::forward<T>(t)}; 格式正确”背后的意图是什么?
【问题讨论】:
-
好吧,如果它是
Ti x = {std::forward<T>(t)},那么即使初始化列表不是参数,它也会允许初始化列表构造函数。通过使其成为一个数组,它永远不会允许这种情况。但我不知道这是否真的是决定的一个因素
标签: c++ initialization language-lawyer variant