引数で渡された関数ポインタまたはラムダ関数を、非同期で実行する関数を書いているときに、期待しないエラーが発生しました。Steps to reproduceのソースコードは、そのエラーが発生する最小限のコードです。asyncCaller([]{}); と asyncCaller(&hoge); は期待通りに動作しました。asyncCaller(hoge); は asyncCaller(&hoge); と同じ結果になることを期待しましたが、実行時エラーとなりました。デバッガを利用して、asyncCaller(hoge); の行からステップインすると、 f が void (*)(void) となりました。f は const F & で宣言されたにもかかわらず、const も & も含まない型となりました。これはバグですか? 仕様ですか?さらに asyncCaller 内の threadProc(&f); の行からステップインすると、pf も void (*)(void) となりました。void (*)(void) である変数 f のアドレスを取るために &f と記述したので、pf は void (**)(void) となることを期待しましたが、そうなりませんでした。これはバグですか? 仕様ですか?さらに pf は void (*)(void) なので、*pf は void (void) となることが期待され、f2 は void (&)(void) となることを期待しましたが、void (*const &)(void) となりました。この型は、asyncCaller(&hoge); を実行した場合と同じです。しかし、f2 のアドレス値は pf と全く異なる値となり、これを呼び出した時点で Actual results に示したメッセージが表示されました。ウォッチで *(void**)f2 は 0x00a946e9 と表示されたので、エラーメッセージで表示されたアドレスと一致しました。これは明らかにバグだと思います。Operating System Languageでは、Japaneseを見つけられなかったのでEnglishを選択しましたが、実際にはJapaneseです。
Visual Studio/Team Foundation Server/.NET Framework Tooling version
Steps to reproduce
Product Language
Operating System
Operating System Language
Actual results
Expected results