Variadic模板无法识别constexpr功能

时间:2013-07-12 09:17:16

标签: c++ c++11 variadic-templates type-safety constexpr

我正在尝试在编译时初始化一些C ++数组但是我得到了一个奇怪的g ++错误。这是我能够获得的最小代码块,它可以重现错误:

#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)... }}; }

g ++ 4.7.1和4.9.0 20130520(实验性)都会发生这种情况。注意 如果我在typename Ar::value_type中将int替换为Map(请参阅注释) {{1}},一切都按预期工作。这是我做错事的错误吗?

1 个答案:

答案 0 :(得分:5)