Es wäre nützlich, "conexpr" -Parameter zu haben, um Compiler-bekannte Werte zu unterscheiden und so in der Kompilierzeit Fehler erkennen zu können. Beispiele:Warum 'constexpr' Parameter nicht erlaubt sind?
int do_something(constexpr int x)
{
static_assert(x > 0, "x must be > 0");
return x + 5;
}
int do_something(int x)
{
if(x > 0) { cout << "x must be > 0" << endl; exit(-1); }
return x + 5;
}
int var;
do_something(9); //instance 'do_something(constexpr int x)' and check arg validity at compile-time
do_something(0); //produces compiler-error
do_something(var); //instance 'do_something(int x)'
Was ist ein ungültiger Code für jetzt. Kann mir jemand erklären, warum das nicht umgesetzt werden kann?
EDIT:
Vorlagen Benutzer verwenden sollte sicherstellen, dass Literale wird immer als Vorlage Argument und nicht als Funktion diejenigen geführt, die sehr unbequem:
template<int x>
int do_something()
{
static_assert(x > 0, "x must be > 0");
return x + 5;
}
int do_something(int x)
{
if(x > 0) { cout << "x must be > 0" << endl; exit(-1); }
return x + 5;
}
int var;
do_something(9); //instance 'do_something(int x)' and doesn't checks validity at compile-time
do_something(0); //same as above, if check was performed - compiler error should occur
do_something<9>(); //instance template 'do_something<int>()'
do_something<0>(); //produces compiler error
do_something(var); //instance 'do_something(int x)'
Können Sie das nicht schon mit einer Vorlage tun? Genauer gesagt mit nicht typisierten Vorlagenparametern? – Borgleader
Dann sollte der Benutzer meiner Funktion eine andere Syntax für den Aufruf angeben, abhängig davon, ob der Parameter zur Kompilierzeit bekannt ist. – AnArrayOfFunctions
ein assert() könnte vermutlich für den Fall optimiert werden, dass ein consExpr-Wert übergeben wurde. –