2016-05-18 17 views
14

aşağıdaki kodu göz önünde bulundurun: -std=c++11 veya -std=c++14 ile çınlama 3.8.0 ile derlemeyeniden yorumlayan bir şablon dışı tür parametresi döküm: C++ vs çınlama C++ 14 1z

template <int* > struct foo { }; 

int main() { 
    foo<(int*)42> f; 
    (void)f; 
} 

, program derler. ile -std=c++1z, bu hataları ile derlerken:

main.cpp:4:9: error: non-type template argument is not a constant expression 
    foo<(int*)42> f; 
     ^~~~~~~~ 

gcc 5.3.0 bakılmaksızın ben doğru olduğuna inandığımız C++ modu, kod derleme yapmaz. C++ 14 ve C++ 1z arasındaki clang farkı nedir ve neden kodu kabul ediyor? Burada alakalı C++ 1z'de bir şey mi değişti?

+1

, VS 2015 derler: İşte

bazı böcek benzer (ancak doğrudan ilişkili olmayan) vakalarla raporlar vardır Sadece iyi – Rakete1111

+1

Açıkçası bir böcek. C++ 1z, non-type şablon argümanlarında rahat kısıtlamalar, yani muhtemelen farklı bir kod yolu (bu hatayı tetiklemez) kullanılır. –

+4

Görünüşe göre boş bir işaretçi gibi ele alınır: http://coliru.stacked-crooked.com/a/966a61826b6d73f9. Bu aklı başında davranış değil. –

cevap

2

godbolt kullanımı, -std=c++1z kipinde Clang 3.5.1'in kodu kabul ettiğini, ancak 3.6.0'ın bunu reddettiğini gösterir. changelog, bu sürümün, C++ 1z özellikleri için destek eklendiğinde, yani "tüm tür olmayan şablon bağımsız değişkenleri için sabit değerlendirme" olduğunu belirtir. Benim tahminim C++ 11 ve C + + 14 modu C++ 11 kurallarını kullanırken C++ 1z modu C++ 1z/son taslak kurallarını kullanıyor. Tabii ki, programın C++ 11/14 modunda geçerli sayılması, kendi başına bir hatadır. Bir yan not olarak

Bug 18043 - allow arbitrary address constant expressions as non-type template arguments as an extension

Bug 10398 - Clang won't accept a null pointer constant as a non-type template argument

Bug 10396 - clang crashes during name mangling with as non-type template parameter

Bug 9700 - Null pointer not accepted as non-type template argument