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?
Na marginesie, VS 2015 kompiluje to po prostu dobrze – Rakete1111
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). –
Jest to najwyraźniej traktowane jak zerowy wskaźnik: http://coliru.stacked-crooked.com/a/966a61826b6d73f9. To nie jest normalne zachowanie. –