gpt4 book ai didi

c++ - 使用 `std::future` 的右值引用作为参数是否合法?

转载 作者:行者123 更新时间:2023-12-05 05:39:58 25 4
gpt4 key购买 nike

使用 std::future 的右值引用作为参数是否合法?有没有我应该注意的潜在问题,因为 std::future::get() is not marked as const .

如果我遗漏了什么,请告诉我。

这是完整的 code snippet :

#include <future>
#include <vector>
#include <iostream>

//int factorial(std::future<int> fut) //works, because there is a move constructor
int factorial(std::future<int>&& fut)
{
int res = 1;
int num = fut.get();

for(int i=num; i>1; i--)
{
res *= i;
}

return res;
}

int main()
{
std::promise<int> prs;
std::future<int> fut_num{prs.get_future()};
std::vector<std::future<int>> vec;

vec.push_back(std::async(std::launch::async, factorial, std::move(fut_num)));


prs.set_value(5);

for(auto& fut: vec)
{
std::cout << fut.get() << std::endl;
}
}

我知道如果我传递左值引用,事情会容易得多。但我仍然意识到函数何时使用 std::future 的右值引用作为参数。

已更新:

一般来说,右值引用绑定(bind)到临时对象。正确引用指向的对象可以调用非常量方法吗?恐怕这是非法的,因为非常量方法可能会修改临时对象。

最佳答案

是的,这是合法的,但我认为在 factorial 中按值接受会容易得多。

这是安全的,因为与 std::thread 一样,您并没有真正将引用传递回 main::fut_num。所以 main 可以退出并且不会有悬空引用。

相反,std::async(std::thread) 从 移动构造它自己的 std::future tmp 变量>std::move(fut_num)(存储在安全的地方,有效地在新线程的范围内)。之后,它调用 factorial(std::move(tmp)

正如我所说,我看不出这有多大值(value),它节省了一个额外的步骤,而且你证明了代码的可读性并不高。与启动线程(甚至从线程池获取作业)的开销相比,任何移动都显得苍白无力。

请注意,当您使用 std::ref 时传递 lvalue 是危险的,或者它复制构造 tmp 这可能是浪费。

关于c++ - 使用 `std::future` 的右值引用作为参数是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72542139/

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