Das folgende Programm mit GCC 5.2 kompiliert, aber nicht mit Klirren 3.6:Ist diese Fehlermeldung richtig: Nicht-Typ Template-Argument ist nicht ein konstanter Ausdruck
constexpr bool flag();
template <bool b = flag()>
constexpr bool test()
{
return b;
}
int main()
{
}
Die Fehlermeldung, die ich mit Klirren bekommen ist:
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()
^
Meine Frage ist: Wer hat Recht? Oder mit anderen Worten: Ist das Programm schlecht formuliert?
Kann dies bestätigen, auch wenn es nicht kling 3.7 kompiliert. Wenn Sie jedoch eine Return-Anweisung in "constexpr bool flag()" schreiben, funktioniert es. – vsoftco
Ich denke, dies bezieht sich auf Ihre andere Frage über den Punkt, wo Standard-Template-Argumente ausgewertet werden: Wenn sie am Definitionspunkt ausgewertet werden, dann kann clang nicht beweisen, dass diese Vorlage unter [temp.res] p8 – dyp
Warum ist Haben Sie eine Rückgabeanweisung in einer void-Funktion? Ich kann auch bestätigen, dass dies auf MSVS 2015 – NathanOliver