ホームページ  >  記事  >  バックエンド開発  >  非 const 参照を `std::async` に渡すことができないのはなぜですか?それを回避するにはどうすればよいですか?

非 const 参照を `std::async` に渡すことができないのはなぜですか?それを回避するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 12:18:30947ブラウズ

Why can't I pass a non-const reference to `std::async` and how do I work around it?

参照によって std::async に渡す引数の非互換性

非 const 参照を引数として std に渡すことができない: :async は開発者を困惑させています。次の例を考えてみましょう:

<code class="cpp">#include <functional>
#include <future>

void foo(int& value) {}

int main() {
    int value = 23;
    std::async(foo, value);
}</code>

コンパイラは次のコードのエラーを報告します:

error: no type named ‘type’ in ‘class std::result_of<void (*)(int)>()’

引数を std::reference_wrapper で囲むと問題は解決しますが、基礎となるコードに関する疑問が生じます。

値ベースの引数渡しの背後にある理由

std::async の設計では、意図的にすべての引数を値で渡すようにデフォルトで設定されています。この選択により、引数のコピーがダングリングになったり、競合状態が発生したりすることがないため、安全性が確保されます。

非 Const 参照パラメータのアドレス指定

ただし、引数を渡すシナリオが存在します。非定数参照による参照が必要です。ここで std::ref が活躍します。 std::ref を使用すると、開発者は、潜在的な結果を理解した上で、非 const 参照を渡すという危険なセマンティクスを明示的に選択できます。

以上が非 const 参照を `std::async` に渡すことができないのはなぜですか?それを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。