2016-05-18 12 views
14

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?

+1

Come nota a margine, VS 2015 compila va bene – Rakete1111

+1

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). –

+4

Apparentemente viene trattato come un puntatore nullo: http://coliru.stacked-crooked.com/a/966a61826b6d73f9. Questo non è un comportamento sano. –

risposta

2

L'utilizzo di godbolt dimostra che nella modalità -std=c++1z Clang 3.5.1 accetta il codice ma 3.6.0 lo rifiuta. Il changelog indica che questa versione era quando il supporto per le funzionalità di C++ 1z è stato aggiunto, vale a dire "Valutazione costante per tutti gli argomenti del modello non di tipo". La mia ipotesi è che la modalità C++ 11 e C++ 14 usi le regole C++ 11 mentre la modalità C++ 1z utilizza le regole di bozza C++ 1z/latest. Naturalmente, il fatto che il programma sia considerato valido in modalità C++ 11/14 è un bug di per sé.

Ecco alcuni bug report con casi simili (ma non direttamente correlate):

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

Problemi correlati