【发布时间】:2011-11-15 14:31:02
【问题描述】:
从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,但这偏离了标准的文本。
如果没有一些特殊的内部编译器魔法,一个符合要求的实现如何可能将其排除在重载决议之外? IE。一个实现可以做到这一点,我可以为我自己的类型复制它吗?似乎没有任何符合这一点的方法!这是从 C++11 中删除概念的后遗症吗?
我确实想知道使用私有构造函数来执行 SFINAE 部分并从公共构造函数进行委托,但看起来构造函数委托参与 SFINAE 的方式并不能使该工作正常进行。
【问题讨论】:
-
“一个一致的实现怎么可能把它排除在重载决议之外?”魔法?
-
@R.MartinhoFernandes - 这似乎是唯一的方法 - 我希望不是这样,因为将大块标准标题变成魔法而不是我可以想象在要解决的实施优先事项列表中排名靠前。
-
你有没有看过一些人是怎么做到的? gcc 似乎在 is_convertible 上使用 enable_if。
-
@PlasmaHH - 你是对的,当我看这个时,我发现我看错了标题。 gcc.gnu.org/bugzilla/show_bug.cgi?id=40925#c3 确实暗示它最初是打算通过概念来处理的。