Il seguente programma viene compilato con GCC 5.2, ma non con clang 3.6:È questo messaggio di errore corretto: non-tipo di argomento modello non è un'espressione costante
constexpr bool flag();
template <bool b = flag()>
constexpr bool test()
{
return b;
}
int main()
{
}
Il messaggio di errore che ottengo con clang è:
main.cpp:3:20: error: non-type template argument is not a constant expression
template <bool b = flag()>
^~~~~~
main.cpp:3:20: note: undefined function 'flag' cannot be used in a constant expression
main.cpp:1:16: note: declared here
constexpr bool flag();
^
main.cpp:4:16: error: no return statement in constexpr function
constexpr bool test()
^
La mia domanda è: chi ha ragione? O, in altre parole: il programma è mal formato?
Può confermare questo, anche clang 3.7 non lo compila. Tuttavia, se inserisci un'istruzione return in 'constexpr bool flag()', funziona. – vsoftco
Penso che questo si riferisca alla tua altra domanda sul punto in cui vengono valutati gli argomenti del template di default: Se sono valutati al punto di definizione, clang non può provare che questo modello è mal formato sotto [temp.res] p8 – dyp
Perché hai una dichiarazione di ritorno in una funzione nulla? Posso anche confermare che questo compila su MSVS 2015 – NathanOliver