gpt4 book ai didi

c++ - Visual Studio 2012 更新 2 中的 std::async 衰减(丢失)右值引用。任何解决方法?

转载 作者:可可西里 更新时间:2023-11-01 17:56:15 28 4
gpt4 key购买 nike

考虑下面的代码:

#include <memory>
#include <future>

using namespace std;

template <typename T, typename Work>
void Test2(future<T> f, Work w)
{
async([](future<T> && f, Work w)
{}, move(f), move(w));
}

int main()
{
future<int> x = std::async([]()->int{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});

Test2(std::move(x), [](int x){});
return 0;
}

以上,由于以下编译器错误而失败:

Error 1 error C2664: 'void Test2::::operator ()(std::future<_Ty> &&,Work) const' : cannot convert parameter 1 from 'std::future<_Ty>' to 'std::future<_Ty> &&' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xrefwrap 98 1 ConsoleApplication6

GCC 4.7.2 编译正常 http://ideone.com/KhMiV6

在我继续并在 Microsoft Connect 上报告它之前:

1) 这是 VC11 的错误还是这实际上是标准行为?

2) 有谁知道解决这个问题的方法吗?

编辑:我已在 Microsoft Connect here 上报告过它.为了更快地解决问题,我们鼓励您对其进行投票。

最佳答案

嗯,这似乎是 VC11 中的一个错误。显然 async 的实现并没有真正转发参数,而是复制了它们。

从我的头顶开始,我会为右值创建一个小包装器,在复制包装器时移动构造元素:

    template <typename T>
struct rvref_wrapper {
rvref_wrapper(T&& value) : value_(std::move(value)) {}
rvref_wrapper(rvref_wrapper const& other) : value_ (other.get()) {}
T&& get() const { return std::move(value_); }
mutable T value_;
};

template <typename T>
auto rvref(T&& x) -> rvref_wrapper<typename decay<T>::type> {
return std::move(x);
}

然后您必须修改您的测试场景,以便 Test2 中的 lambda 采用包装器而不是 future 本身:

    template <typename T, typename Work>
void Test2(future<T> f, Work w)
{
async([](rvref_wrapper<future<T>> fr, Work w) {
// acquire future<T>&& here
future<T> f(fr.get());
// e.g. call work with future value
w(f.get());
}, rvref(f), move(w));
}

int main()
{
future<int> x = std::async([]()->int{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});

Test2(std::move(x), [](int x){});
return 0;
}

看起来有点难看,但至少可以编译。希望对你有帮助!

关于c++ - Visual Studio 2012 更新 2 中的 std::async 衰减(丢失)右值引用。任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16140293/

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