私は最近、ほとんどの場合に動作するが、未定義の動作に依存しているコードベースのラムダを発見しました。ここでの例である:ローカルテンポラリをキャプチャするラムダ関数をキャッチ
#include <iostream>
#include <thread>
std::thread thread;
void foo(int bar)
{
thread = std::thread([&]() { std::cout << bar << std::endl; });
}
int main(int argc, char* argv[])
{
foo(5);
thread.join();
}
ローカルスコープ(バー)の変数を参照することによって捕捉され、後の時点でアクセスされることがある問題。不思議なことに、私たちのコンパイラ(GCC、Clang、MSVC)は、たとえ "警告:ローカル一時オブジェクトのアドレスを返す"として捕まえるのが簡単であっても、デフォルトでこれについて警告していません。上記のコンパイラがこれについて警告する方法はありますか?
ローカル変数のアドレスを返すのは誰ですか? –
「捕まえるのは簡単だ」と大胆な発言です。あなたのコードで 'std :: thread'を' magic_box'で置き換え、コンパイラがこれについてまだ警告するべきかどうかを教えてください。 –
投稿したコードにUBはありません。すべての変数のライフタイムは、アクセスしても終了しません。 –