[英]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技巧。
我錯過了兩條信息:
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
模板參數的默認值。 我之前沒見過, 這個實現沒有使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.