Допустимо ли использовать функцию constexpr в качестве аргумента шаблона? - PullRequest
10 голосов
/ 15 июня 2011
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
}

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

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

1 Ответ

13 голосов
/ 15 июня 2011

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

...