7

序文 -- 私は C++ ラムダが大好きです。できればどこでも使用します。

今、ラムダ要件があります。__stdcall ラムダが必要です。しかし、次のエラー メッセージが表示されます。

 error C2664: 'EnumWindows' : cannot convert parameter 1 from '`anonymous-namespace'::<lambda1>' to 'WNDENUMPROC'
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

誰でも私を助けることができますか?これが私のコードです(EnumWindowsProc は関数スコープにあります):

        auto EnumWindowsProc = 
            [&](HWND hwnd, LPARAM lParam) mutable -> bool
        {
            return true;
        };
        EnumWindows(EnumWindowsProc, NULL);
4

1 に答える 1

11

visual studio 2010タグが付いていることに今気づきました。ステートレス ラムダは VC11 で実装されました。参考

ラムダがワーキング ペーパー (v0.9) に投票され、変更可能なラムダが追加された (v1.0) 後、標準化委員会は文言を見直し、ラムダ v1.1 を作成しました。 これは VC10 で実装するには遅すぎましたが、VC11 では既に実装しています。 ラムダ v1.1 の文言は、静的メンバーやネストされたラムダの参照などのまれなケースで何が起こるべきかを明確にしています。これにより、複雑なラムダによって引き起こされる一連のバグが修正されます。さらに、ステートレス ラムダは、VC11 で関数ポインターに変換できるようになりました。これは N2927 の文言にはありませんが、ラムダ v1.1 の一部として数えます。FDIS 5.1.2 [expr.prim.lambda]/6 です。「ラムダキャプチャのないラムダ式のクロージャー型には、クロージャー型の関数呼び出し演算子と同じパラメーターと戻り値の型を持つ関数へのポインターへのパブリックな非仮想非明示的な const 変換関数があります。これによって返される値変換関数は、呼び出されたときにクロージャー型の関数呼び出し演算子を呼び出すのと同じ効果を持つ関数のアドレスでなければなりません。」(ステートレスなラムダを任意の呼び出し規則で関数ポインターに変換できるようにしたので、それよりもさらに優れています。これは、__stdcall 関数ポインターなどを予期する API を扱う場合に重要です。 )

また、この変換は、2 番目の太字の引用に記載されているキャプチャ仕様がない場合に発生することに注意してください。

于 2013-07-18T03:52:30.980 に答える