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

Fle*_*exo 11 c++ sfinae c++11

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

template<class U, class V> pair(pair<U, V>&& p); 
template<class U, class V> pair(const pair<U, V>& p);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

n. *_* m. 4

但这偏离了标准的文本

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

  • 在17.6.5.5/2(根据我的n3290副本)。 (2认同)