Byłoby użyteczne mieć parametry "constexpr" w celu odróżnienia wartości znanych od kompilatora, aby móc wykryć błędy podczas kompilacji. Przykłady:Dlaczego parametry "constexpr" są niedozwolone?
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)'
Który jest teraz nieprawidłowy. Czy ktoś może mi wyjaśnić, dlaczego nie można tego zrealizować?
EDIT:
pomocą szablonów użytkowników powinny zapewnić, że literały są zawsze przekazywane jako argumenty szablonu, a nie te, które działają bardzo niewygodne:
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)'
Czy możesz już to zrobić za pomocą szablonu? W szczególności z parametrami szablonu non-type? – Borgleader
Następnie użytkownik mojej funkcji powinien dostarczyć inną składnię do wywoływania go w zależności od tego, czy parametr jest znany w czasie kompilacji. – AnArrayOfFunctions
Prawdopodobieństwo, że assert() zostanie zoptymalizowane w przypadku przekazania wartości constexpr. –