在阅读构造函数[variant.ctor]定义的标准时:
template<class T> constexpr variant(T&& t) noexcept(see below);
我受到一个模糊的限制:
我想了解这个限制的目的是什么:
没有此限制,重载解决方案将消除所有无法通过复制初始化初始化参数的重载。
据我所挖,
Ti x[] = {std::forward<T>(t)}
应该落在[dcl.init.aggr]/2上:因此,我看到此限制从重载虚函数的集合中删除了那些在调用时涉及缩小转换的函数。但是也许还有更多?我错了吗?为什么要在限制中初始化数组,为什么不要
Ti x = {std::forward<T>(t)}
? “Ti x[] = {std::forward<T>(t)};
格式正确”的目的是什么? 最佳答案
该措辞由P0608R3 A sane variant converting constructor添加。本文在Proposed resolution部分中很好地总结了更改:
因此,此更改的唯一目的是防止缩小转换范围。
为什么要使用数组? Wording部分中的草稿便回答了您的问题:
关于c++ - 关于如何在具有单个参数的变体构造中选择替代方案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59686466/