2014-09-14 50 views
26

Bir tür tam olup olmadığını kontrol etmek için bu C++ 11 özellik şablonu yazdı:Bir is_complete türü özelliğim tarafından uygulandığım bir derleyici hatası var mı?

template <typename...> 
using void_t = void; 

template <typename T, typename = void> 
struct is_complete : std::false_type 
{}; 

template <typename T> 
struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type 
{}; 

ve şu şekilde test: Ben 10 yazdırmak için test programı beklenen

struct Complete {}; 

int main() 
{ 
    std::cout << is_complete<Complete>::value 
       << is_complete<class Incomplete>::value 
       << '\n'; 
} 

ve bu clang 3.4 ile derlediğimde elde ettiğim çıktı. Ancak, gcc 4.9 ile derlendiğinde, bunun yerine class Incomplete'u tam olarak tanımlayarak 11'u yazdırır.

Kodumun doğru olup olmadığını bilmiyorum, ancak yanlış olsa bile, her iki derleyicide de aynı davranmalıdır.

Soru 1: kodum doğru?
Soru 2: Derleyicilerden birinde bir hata buldum mu?

DÜZENLEME:

benim kodu için bir değiştirme için sormuyorum. Ben gcc veya clang bir hata olup olmadığını ve bu özel yapı doğru olup olmadığını soruyorum.

+0

İlgili: http://stackoverflow.com/questions/25796126/static-assert-that-template-typename-t-is-not-complete – chris

+0

@chris - bu bir kopya değil - soru ilgili gcc veya clang'dan hata. – Felics

+0

Bunun bir dupe olduğunu söylemedim ya da bu şekilde kapanmaya oy verdim. Hem GCC hem de Clang'da çalışan bir şey istiyorsanız, yardımcı olur. – chris

cevap

27

Sorun, void_t tanımında görünüyor.

template<typename... Ts> 
struct make_void { typedef void type;}; 

template<typename... Ts> 
using void_t = typename make_void<Ts...>::type; 

olarak tanımlanması yerine iki derleyici (Demo) doğru bir sonuç (10) verir.

Bu sorunun, N3911 bölüm 2.3'te belirtilen, void_t ve CWG issue 1558 öneren kağıtla aynı sorun olduğuna inanıyorum. Aslında, standart, şablon şablonu uzmanlıklarındaki kullanılmayan argümanların ikame hatasına yol açıp açmadığı veya basitçe göz ardı edilip edilmediği belirsizdi. Komite'nin Kasım 2014 toplantısında kabul edilen CWG sorununun çözümü, sorudaki void_t'un daha kısa tanımının işe yarayacağını ve GCC 5.0'ın çözünürlüğü uyguladığı konusuna açıklık getirmektedir.

İlgili konular