从this answer开始,似乎是这些构造函数:
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 workaround,但这与标准文本有所不同。
一致的实现怎么可能将这个从重载解析中排除,缺少一些特殊的内部编译魔术?即一个实现可以做到这一点,我可以复制它为我自己的类型吗?似乎没有任何符合这一点!这是从C ++ 11中删除概念的遗留问题吗?
我确实想知道如何使用私有构造函数来执行SFINAE部分并从公共构造函数委派,但看起来构造函数委派不会以这样的方式参与SFINAE。
答案 0 :(得分:4)
但这与标准文本
有所不同
允许实现向任何非虚拟库成员函数添加默认参数。这似乎准确地允许了这种SFINAE技巧。
答案 1 :(得分: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
模板参数的默认设置。我之前没见过,this implementation没有使用过。