可变模板不';不能识别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); #包括 模板 constexpr-Ar映射(typename-Ar::value\u-type/*int*/fun(int)) {return{{fun(Vals)…};} constexpr int add(int i){return i+1;} constexpr auto b=映射(添加);

可变模板不';不能识别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); #包括 模板 constexpr-Ar映射(typename-Ar::value\u-type/*int*/fun(int)) {return{{fun(Vals)…};} constexpr int add(int i){return i+1;} constexpr auto b=映射(添加);,c++,c++11,variadic-templates,type-safety,constexpr,C++,C++11,Variadic Templates,Type Safety,Constexpr,编译器在抱怨 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 {

编译器在抱怨

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)... }}; }
bug.cpp:8:53:在“Map(add)”的constexpr扩展中
bug.cpp:4:80:错误:表达式“add”未指定constexpr函数
constexpr Ar映射(typename Ar::value_type/*int*/fun(int)){return{{fun(Vals)…..};}
这在g++4.7.1和4.9.0 20130520(实验)中都会发生。注意 如果在定义中用
int
(参见注释)替换
typename Ar::value\u type

Map
,一切正常。这是我做错了什么的错误吗?

我想是的。

typename Ar::value\u type
替换为
int
though@mirk:阅读错误报告:
示例中的模板参数具有与typedef类似的效果。这两个用例都不应使constepr字符无效。
typedef
或模板参数一起使用时会发生这种情况。感谢您的回答!调试这些代码仍然是一场噩梦。