在阅读构造函数[variant.ctor]定义的标准时:
template<class T> constexpr variant(T&& t) noexcept(see below);
我受到一个模糊的限制:
让
Tj
成为如下确定的类型:为每个替代类型FUN(Ti)
建立一个虚函数Ti
Ti x[] = {std::forward<T>(t)}
;对于某些发明变量x
的格式正确...通过过载解析为表达式FUN(Tj)
选择的过载FUN(std::forward<T>(t))
定义了替代项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)};
格式正确”的目的是什么?
此措词由P0608R3 A sane variant converting constructor添加。本文在Proposed resolution部分中很好地总结了更改: