4

次のコードをコンパイルして取得できます。

enum E {a, b, c};
void f()
{
    E e;
    std::function<void()> f = [&]() { e = a; };
} 

ただし、次のものではありません。

void f()
{
    enum E {a, b, c};
    E e;
    std::function<void()> f = [&]() { e = a; };
} 

次のコンパイラ エラーが発生します。

1>test.cpp(5): error C2665: '`anonymous-namespace'::<lambda1>::<lambda1>' : none of the 2 overloads could convert all the argument types
1>          test.cpp(5): could be '`anonymous-namespace'::<lambda1>::(f::E &,f::E &)'
1>          while trying to match the argument list '(f::E, f::E)'

そのエラーは予想されるものですか、それともバグですか?

4

1 に答える 1

6

これは、http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/88f533d8-b7f5-4416-bdcf-b461aeb74178の問題と同じようです。そこにあるように、コンパイラのバグのようです。MSVC には、ラムダのローカル型に関するいくつかの問題があるようです。http://connect.microsoft.com/VisualStudio/feedback/details/675113/lambda-expression-causes-internal-compiler-error#detailsも参照してください。

5.1.2 ラムダ式 [expr.prim.lambda]には、ローカルで定義された型をラムダでキャプチャできないと言う言語はありません。

于 2012-08-29T12:11:21.287 に答える