28

次のように、ラムダを静的メンバーとして使用しようとしています。

struct A
{
    static constexpr auto F = [](){};
};


int main()
{
    A::F();
    return 0;
}

これは正しい C++11 コードですか? clang で、次のエラーが発生します。

error: constexpr variable 'F' must be initialized by a constant
      expression
    static constexpr auto F = [](){};
                              ^~~~~~

ラムダは定数式とは見なされません。これは正しいです?おそらく、gcc 4.7 ではラムダを として許可しているように見えるため、clang でラムダをまだ完全に実装していない可能性constexprがありますが、別のエラーが発生します。

error: ‘constexpr const<lambda()> A::F’, declared using local type ‘const<lambda()>’, is used but never defined

よくわかりませんが、それが何を意味するのか理解しています。ラムダの型を正しく推測しているように見えますが、宣言するだけで定義しません。それを定義するにはどうすればよいですか?

4

2 に答える 2

17

このコードは形式が正しくありません。変数は定数式で初期化するconstexpr必要があり、次のように[expr.const]p2述べています。

条件式は、潜在的に評価される部分式として次のいずれかを含まない限り、コア定数式です [...]:

  • ラムダ

したがって、GCC がこのコードを受け入れるのは正しくありません。

クラスにラムダ型の静的データ メンバーを与える 1 つの方法を次に示します。

auto a = []{};
struct S {
  static decltype(a) b;
};
decltype(a) S::b = a;
于 2012-07-31T06:06:17.277 に答える