Я играю с некоторым кодом игрушек, используя C++ 11, чтобы узнать немного больше о том, как все работает. Во время этого я наткнулся на следующий вопрос, который упрощает вниз:Параметры функции constexpr как аргументы шаблона
template <int x, int y>
class add {
public:
static constexpr int ret = x + y;
};
constexpr int addFunc(const int x, const int y) {
return add<x,y>::ret;
}
int main() {
const int x = 1;
const int y = 2;
cout << add<x,y>::ret << endl; // Works
cout << addFunc(1,2) << endl; // Compiler error
return 0;
}
Я использую GCC 4.8.1, а выход:
«х» не является константным выражением в шаблоне аргумента для типа «INT '
„у“ не является постоянным выражением в шаблоне аргумента для типа „INT“
Что именно разница между этими двумя способами я пытаюсь вычислить add::ret
? Оба эти значения должны быть доступны во время компиляции.
Функции 'constexpr' должны выполняться во время выполнения. – chris
Ну ... да. Так почему конкретно это невозможно оценить во время компиляции? – Danny
Чтобы разработать: 'constexpr' функции должны быть запущены во время выполнения, и ваша функция' constexpr' будет терпеть неудачу при вызове с любым значением, которое не является константой времени компиляции, поэтому ваша функция 'constexpr' недействительна , То, что вы ищете, не то, что предоставляет 'constexpr', и это не то, что предлагает C++ в другой форме. То, что ближе всего, делает 'addFunc' функцию шаблона с параметрами шаблона' int x' и 'int y'. – hvd