Действительно ли использовать функцию constexpr в качестве аргумента шаблона?

constexpr int get () { return 5; }
template<int N> struct Test {};

int main ()
{
  int a[get()];  // ok
  Test< get() > obj;  // error:'int get()' cannot appear in a constant-expression
}

У меня скомпилирован этот код с ideone. И было интересно, почему он дает ошибку компиляции. Функция constexpr не разрешена в качестве аргумента template или это ошибка в компиляторе?

Изменить: изменено const int get() на int get() Более того, есть еще одна ошибка с идеоне в том, что если вы удалите constexpr, то все еще объявляет, что массив разрешен! Я считаю, что функция C99.

Ответ 1

GCC 4.5 (по крайней мере, версия, используемая в Ideone) не поддерживает полностью constexpr, включая ваше действительное использование; он опускается до const. GCC 4.6 и правильно его поддерживает.