2013-07-12 3 views
2

Я пытаюсь инициализировать некоторый массив C++ во время компиляции, но у меня возникла странная ошибка g ++. Вот маленький кусок кода, который я смог получить воспроизводящие ошибку:Шаблон Variadic не распознает функцию constexpr

#include <array> 

template<typename Ar, int... Vals> 
constexpr Ar Map(typename Ar::value_type /*int*/ fun(int)) 
{ return {{ fun(Vals)... }}; } 

constexpr int add(int i) { return i + 1; } 

constexpr auto b = Map<std::array<int, 2>, 1, 2>(add); 

Компилятор жалуется

bug.cpp:8:53: in constexpr expansion of ‘Map<std::array<int, 2ul>, {1, 2}>(add)’ 
bug.cpp:4:80: error: expression ‘add’ does not designate a constexpr function 
constexpr Ar Map(typename Ar::value_type /*int*/ fun(int)) { return {{ fun(Vals)... }}; } 

Это происходит как с г ++ 4.7.1 и 4.9.0 20130520 (экспериментальный). Обратите внимание, что , если я заменил typename Ar::value_type на int (см. Комментарий) в определении Map, все работает должным образом. Это ошибка, я делаю что-то неправильно?

ответ

5
+0

Он компилируется, когда 'typename Ar :: value_type' заменяется на' int' хотя – mirk

+0

@mirk: Прочитайте отчет об ошибке: 'Параметр шаблона в вашем примере имеет похожие эффекты как typedef. Оба варианта использования не должны приводить к аннулированию символа constexpr. «Это происходит при использовании с параметром typedef или template. –

+0

вы, скорее всего, правы. – mirk

Смежные вопросы