2

コンパイル時にいくつかの 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に置き換えると、すべてが期待どおりに機能することに注意してください。これは私が何か間違ったことをしているというバグですか?intMap

4

1 に答える 1

5

これはバグ 52892 - 関数ポインタが constexpr 修飾を失うことだと思います。

于 2013-07-12T09:24:11.723 に答える