3
#include <iostream>
#include <memory>
#include <future>

using namespace std;

unique_ptr<int> uq(new int);

void foo(unique_ptr<int> q)
{}

int main()
{
    foo(move(uq));
    // ^ OK

    async(foo, move(uq));
    // ^ Error: error C2248: 'std::unique_ptr<_Ty>::unique_ptr' :
    //    cannot access private member declared in class 'std::unique_ptr<_Ty>'
}

为什么“异步”无法编译?我使用 Microsoft Visual Studio 2012 (v4.5.50709)。

4

1 回答 1

2

这应该根据标准工作,并且在 gcc 上工作

它在 VS 上失败的原因可能是因为std::async允许存储其参数的内部副本,然后这些副本将在稍后传递给被调用的函数。

在这种情况下,这将需要对 unique_ptr 进行两次移动:一次为 async 构造中间对象,然后在将参数传递给foo. 两者之一可能会失败。然而,标准明确指出,参数async只能是 MoveConstructible(第 30.6.8.2 节),即unique_ptr

所以我会说这是VS2012标准库实现中的一个错误。

于 2013-06-06T07:30:20.830 回答