Я играю с некоторым кодом игрушек, используя С++ 11, чтобы узнать немного больше о том, как все работает. Во время этого я наткнулся на следующий вопрос, который упрощает до:
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, а вывод:
'x' не является постоянным выражением в аргументе шаблона для типа 'int'
'y' не является постоянным выражением в аргументе шаблона для типа 'int'
В чем именно разница между двумя способами, которые я пытаюсь рассчитать add::ret
? Оба эти значения должны быть доступны во время компиляции.