2016-05-18 10 views
14

Rozważmy następujący kod:reinterpretacji rzucić non-typ parametru szablonu: dzyń C++ 14 vs C++ 1z

template <int* > struct foo { }; 

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

Podczas kompilacji na szczęk 3.8.0 z -std=c++11 lub -std=c++14 program kompiluje. Podczas kompilacji z -std=c++1z, nim błędów z:

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

gcc 5.3.0 nie kompiluje kod niezależnie od trybu C++, który uważam za prawidłowe. Jaka jest różnica w klangu między C++ 14 i C++ 1z i dlaczego akceptuje kod? Czy coś się zmieniło w C++ 1z, co jest tutaj istotne?

+1

Na marginesie, VS 2015 kompiluje to po prostu dobrze – Rakete1111

+1

Najwyraźniej błąd. C++ 1z rozluźnia ograniczenia dla nie szablonowych argumentów szablonu, więc używa się prawdopodobnie innej ścieżki kodu (która nie uruchamia błędu). –

+4

Jest to najwyraźniej traktowane jak zerowy wskaźnik: http://coliru.stacked-crooked.com/a/966a61826b6d73f9. To nie jest normalne zachowanie. –

Odpowiedz

2

Korzystanie z godbolt pokazuje, że w trybie -std=c++1z Clang 3.5.1 akceptuje kod, ale 3.6.0 go odrzuca. Numer changelog wskazuje, że ta wersja została dodana, gdy dodano obsługę funkcji C++ 1z, a mianowicie "Stałą ocenę dla wszystkich niepoprawnych argumentów szablonu". Domyślam się, że tryb C++ 11 i C++ 14 używa reguł C++ 11, podczas gdy tryb C++ 1z używa C++ 1z/najnowsze reguły szkicowania. Oczywiście fakt, że program jest uznawany za poprawny w trybie C++ 11/14, jest błędem samym w sobie.

Oto niektóre raporty o błędach z podobnych (ale nie bezpośrednio powiązanych) przypadkach:

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

Powiązane problemy