12

私は奇妙な問題に遭遇しました。次の簡略化されたコードは、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 つのバグ レポートを提出しました。

上記のすべてのコード スニペットをコンパイルする必要があります。このエラーは、ローカルで定義されたスコープでスコープ解決を使用することに関係しています。(dvideによって発見されました。)

そして、クラッシュバグは... 誰が知っている. :)


アップデート

バグ レポートによると、これらは両方とも Visual Studio 2010 の次のリリースで修正されています。

4

4 に答える 4

9

n3000 から、5.1.2/6、

ラムダ式の複合ステートメントは、関数呼び出し演算子の関数本体 (8.4) を生成しますが、名前検索 (3.4) の目的で、複合ステートメントはラムダ式のコンテキストで考慮されます。

驚くことではありませんが、ローカル タイプが表示されるはずです。

于 2010-01-23T06:40:16.360 に答える
3

関数ローカルな列挙型は、ラムダでも検出できません。

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

エラー C3493: 既定のキャプチャ モードが指定されていないため、'A' を暗黙的にキャプチャすることはできません

以下は回避策ですが、問題があるかもしれません。

int main()
{   
    enum E {A, B, C};   
    auto x = [=](){ int a = A; };
    // typedef E F; 
    // auto y = [=](){ F a = A; }; // this compiles ok
}
于 2010-05-21T18:01:53.513 に答える
2

これは実際にはあなたの質問に対する答えではありませんが、問題をさらに調査するだけです。コンパイラが囲んでいるスコープで宣言されたを処理する際に問題があるかどうか疑問に思っていたので、これを試してみました:

#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、Beta 2 で) コンパイルされないだけでなく、C1001 内部エラーで実際にコンパイラをクラッシュさせます。

于 2010-01-23T06:05:44.170 に答える
2

私は2つのバグレポートを提出しました。

  • Tarydonによるクラッシュバグ。(報告
  • ラムダ スコープ解決のバグ。(報告

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


アップデート

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

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

ありがとう、
Ulzii Luvsanbat
Windows C++ チーム

それでは、行きましょう。

于 2010-01-23T06:52:12.843 に答える