2017-06-03 83 views
0

近日在回答一個問題在這裏if-else depends on whether T is a complete type我意識到,下面無法編譯關於SFINAE爲不完全類型

#include <iostream> 
#include <type_traits> 

using namespace std; 

class Incomplete; 
class Complete {}; 

template <typename IncompleteType> 
struct DetermineCompleteHelper : public IncompleteType {}; 

template <typename IncompleteType, typename = std::enable_if_t<true>> 
struct DetermineComplete { 
    static constexpr const bool value = false; 
}; 

template <typename IncompleteType> 
struct DetermineComplete<IncompleteType, std::enable_if_t<std::is_same< 
     decltype(DetermineCompleteHelper<IncompleteType>{}), 
     decltype(DetermineCompleteHelper<IncompleteType>{})>::value>> { 
    static constexpr const bool value = true; 
}; 

int main() { 
    cout << DetermineComplete<Complete>::value << endl; 
    cout << DetermineComplete<Incomplete>::value << endl; 
    return 0; 
} 

但改變局部模板專業化

template <typename IncompleteType> 
struct DetermineComplete<IncompleteType, std::enable_if_t<std::is_same< 
     std::integer_sequence<int, sizeof(IncompleteType)>, 
     std::integer_sequence<int, sizeof(IncompleteType)>>::value>> { 
    static constexpr const bool value = true; 
}; 

特殊規則使代碼編譯沒有錯誤,爲什麼這種不規範?不應該將第一個表達式視爲部分特化的上下文中的錯誤,並因此讓SFINAE啓動並使該類的默認定義成爲實例化的類型?

回答

3

嘗試實例化DetermineCompleteHelper<IncompleteType>(特別是,它試圖從不完整的基類派生)的定義時發生該錯誤。這不在眼前的情況下。

+0

在直接上下文中,sizeof(DetemineCompleteHelper )如何?這樣做是否也會嘗試查看實例化類的大小? – Curious

+0

@Curious你的「編譯」例子是'sizeof(IncompleteType)'。 –

+0

... nvm,我問得太快了,應該先閱讀我之前寫的代碼 – Curious