Si consideri il seguente codice:reinterpretano gettato un parametro non tipo di modello: clang C++ 14 vs C++ 1Z
template <int* > struct foo { };
int main() {
foo<(int*)42> f;
(void)f;
}
Quando si compila il clangore 3.8.0 con -std=c++11
o -std=c++14
, il programma viene compilato. Quando si compila con -std=c++1z
, esso errori con:
main.cpp:4:9: error: non-type template argument is not a constant expression
foo<(int*)42> f;
^~~~~~~~
gcc 5.3.0 non compila il codice indipendentemente dal modo C++, che credo di essere corretto. Qual è la differenza di clang tra C++ 14 e C++ 1z e perché accetta il codice? Qualcosa è cambiato in C++ 1z che è rilevante qui?
Come nota a margine, VS 2015 compila va bene – Rakete1111
Chiaramente un insetto. C++ 1z vincoli rilassati su argomenti modello non di tipo, quindi presumibilmente viene utilizzato un percorso di codice diverso (che non attiva il bug). –
Apparentemente viene trattato come un puntatore nullo: http://coliru.stacked-crooked.com/a/966a61826b6d73f9. Questo non è un comportamento sano. –