繁体   English   中英

排除使用显式构造的std :: pair构造函数

[英]Excluding std::pair constructors that use explicit construction

这个答案后 ,似乎这些构造函数:

template<class U, class V> pair(pair<U, V>&& p); 
template<class U, class V> pair(const pair<U, V>& p);

当他们需要显式转换时,禁止参与重载决策。

从C ++ 11(§20.3.2,n3290):

备注:此构造函数不应参与重载决策,除非U可隐式转换为first_type且V可隐式转换为second_type。

有人提出了一个有趣的SFINAE解决方法 ,但这与标准文本有所不同。

一致的实现怎么可能将这个从重载解析中排除,缺少一些特殊的内部编译魔术呢? 也许一个实现可以做到这一点,我可以复制它为我自己的类型吗? 似乎没有任何符合这一点! 它是从C ++ 11中删除概念的宿醉吗?

我确实想知道如何使用私有构造函数来执行SFINAE部分并从公共构造函数委派,但它看起来并不像构造函数委派以这样的方式参与SFINAE。

但这从标准的文本中脱离出来

允许实现向任何非虚拟库成员函数添加默认参数。 这似乎准确地允许这种SFINAE技巧。

我错过了两条信息:

  1. gcc使用这个:

     template<class _U1, class _U2, class = typename std::enable_if<std::is_convertible<_U1, _T1>::value && std::is_convertible<_U2, _T2>::value>::type> pair(_U1&& __x, _U2&& __y) : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { } 

    诀窍似乎是匿名class模板参数的默认值。 我之前没见过, 这个实现没有使用它。

  2. 我错过了gcc实际实现了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM