Было бы полезно иметь параметры constexpr, чтобы различать значения, известные компилятору, и таким образом иметь возможность обнаруживать ошибки во время компиляции. Примеры:
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)'
Это недействительный код на данный момент. Может кто-нибудь объяснить мне, почему это невозможно реализовать?
РЕДАКТИРОВАТЬ:
Используя шаблоны, пользователи должны гарантировать, что литералы всегда передаются как аргументы шаблона, а не как функциональные, что очень неудобно:
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)'
constexpr
не является квалификатором типа. Вы хотите, чтобы это было? У нас уже естьconst
иvolatile
, которые вместе дают 4 комбинации. Нам действительно нужно больше? - person n. 1.8e9-where's-my-share m.   schedule 21.12.2014#define DO_SOMETHING(...) do_something<__VA_ARGS__>()
- person GingerPlusPlus   schedule 21.12.2014