質問

奇妙な問題に遭遇しました。次の簡略化されたコードは、MSVC 2010 の問題を再現します。

template <typename T>
struct dummy
{
    static T foo(void) { return T(); }
};

int main(void)
{
    typedef dummy<bool> dummy_type;
    auto x = []{ bool b = dummy_type::foo(); };
    // auto x = []{ bool b = dummy<bool>::foo(); }; // works
}

typedef ローカルで作成した関数がラムダには表示されないようです。交換すると typedef 実際の型では、期待どおりに動作します。

その他のテスト ケースをいくつか示します。

// crashes the compiler, credit to Tarydon
int main(void)
{
    struct dummy {};

    auto x = []{ dummy d; };
}

// works as expected
int main(void)
{
    typedef int integer;

    auto x = []{ integer i = 0; };
}

現時点では、テストに使用できる g++ がありません。これは C++0x の奇妙なルールですか、それともコンパイラの単なるバグですか?

上記の結果から、私はバグに傾いています。ただし、クラッシュは間違いなくバグです。


とりあえず2件提出しました バグレポート.

上記のコード スニペットはすべてコンパイルされるはずです。このエラーは、ローカルに定義されたスコープでのスコープ解決の使用に関係しています。(発見者 分割.)

そしてクラッシュバグと関係があるのは...知るか。:)


アップデート

による バグレポート, 、両方とも Visual Studio 2010 の次のリリースで修正されています。(ただし、そうではないようです。おそらくVS11。)

役に立ちましたか?

解決

N3000から、5.1.2 / 6、

  

ラムダ式さん   複合文の利回り   関数の関数本体(8.4)   呼び出し演算子が、目的のため   名前検索(3.4)、...   化合物-文はで考えられています   ラムダ式の文脈ます。

驚くべきことではないが、局所型が表示されなければならない。

他のヒント

機能ローカル列挙のいずれかラムダによって検出することができない。

int main()
{   
    enum E {A, B, C};   
    auto x = [](){ int a = A; }; 
    //auto y = [](){ E a = A; }; // this will crash the compiler
}

エラーC3493:デフォルトのキャプチャモードが指定されていないため、「A」が暗黙的に取得することができません。

続きを問題-多分、workroundあるもののます。

int main()
{   
    enum E {A, B, C};   
    auto x = [=](){ int a = A; };
    // typedef E F; 
    // auto y = [=](){ F a = A; }; // this compiles ok
}

これは本当にあなたの質問への答えではなく、単に問題をさらに探求します。

:コンパイラはの種類の扱う問題はので、このアウトが試した、囲みスコープ内で宣言している場合、私は思っていました
#include <iostream>

template <typename Func>
void do_test(Func pFunc) {
}

template <typename T>
void test_trait(void) {
   class Something { public: int foo; };

   do_test ([] (T pX) {
      Something A; A.foo = 12;
   });
}

int main(void) {
    test_trait<int> ();
}
ここで、私はちょうど囲みスコープ内のローカル種類を作成し、ラムダ関数内から、それを使用しようとしています。これは、(のVisual Studio 2010ベータ2で)コンパイルしていないが、それは実際にはC1001内部エラーでコンパイラがクラッシュするだけでなく。

バグレポートを 2 件提出しました。

どうなるか見てみましょう。:)


アップデート

両方のバグが修正済みとしてマークされています。

あなたのコメントに感謝します。このバグは以前にも確認されており、次のリリースで修正されました。製品をご利用いただきありがとうございます。

ありがとう、
ウルジイ・ルブサンバット
Windows C++ チーム

それでは行きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top