簡體   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