gpt4 book ai didi

c++ - 通过引用将参数传递给 std::async 失败

转载 作者:IT老高 更新时间:2023-10-28 21:53:57 26 4
gpt4 key购买 nike

我注意到不可能将非常量引用作为参数传递给 std::async

#include <functional>
#include <future>

void foo(int& value) {}

int main() {
int value = 23;
std::async(foo, value);
}

我的编译器 (GCC 4.8.1) 对此示例给出以下错误:

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

但如果我将传递给 std::async 的值包装在 std::reference_wrapper 中,一切正常。我认为这是因为 std::async 按值接受它的参数,但我仍然不明白错误的原因。

最佳答案

这是一个深思熟虑的设计选择/权衡。

首先,不一定可以找出传递给 async 的 functionoid 是否通过引用获取其参数。 (例如,如果它不是一个简单的函数而是一个函数对象,它可能有一个重载的函数调用运算符。)所以 async 不能说,“嘿,让我检查一下目标函数想要什么,我会做正确的事。”

所以设计问题是,如果可能的话,它是否通过引用来获取所有参数(即,如果它们是左值),还是总是复制?制作拷贝是这里的安全选择:拷贝不能变得悬空,并且拷贝不能表现出竞争条件(除非它真的很奇怪)。所以这就是做出的选择:默认情况下复制所有参数。

但是,该机制被编写为实际上无法将参数传递给非常量左值引用参数。这是另一个安全选择:否则,您希望修改原始左值的函数会修改拷贝,从而导致难以追踪的错误。

但是如果你真的非常想要非 const 左值引用参数怎么办?如果您 promise 要注意悬空引用和竞争条件怎么办?这就是 std::ref 的用途。这是对危险引用语义的明确选择。这是你的表达方式,“我知道我在这里做什么。”

关于c++ - 通过引用将参数传递给 std::async 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18359864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com