【发布时间】:2018-09-20 22:01:42
【问题描述】:
一些std::optional 构造函数使用std::in_place_t 标记参数,如下所示:
template< class... Args >
explicit optional( std::in_place_t, Args&&... args );
我看到这样的构造函数可以在没有就地标记的情况下实现,并使用一些enable_if (SFINAE) 魔法来不参与不情愿的重载,即:
template< class... Args >
explicit optional( Args&&... args );
为什么std::optional 的就地构造函数使用std::in_place_t 标签而不是一些enable_if 魔术(并且没有标签)实现?
更新:稍微更新了问题,以强调我意识到简单地省略就地标记是行不通的。
【问题讨论】:
-
匹配任何东西。
-
@Cheersandhth.-Alf 为什么这是个问题?
-
假设
T有一个隐式转换构造函数,它接受一个类型不等于T的单个参数。然后,您将创建一个临时值,而不是将该值用于就地构造,而没有机会更改它。 -
@MatthäusBrandl 但你可以通过 SFINAE 来阻止这种情况。实际上,无论有无标签,都只转发一个参数。没有创建临时对象
-
据我所知,假设的无标签版本失败的唯一情况是默认构造包含的值
标签: c++ c++17 stdoptional