2013-06-06 3 views
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>' 
} 

Почему 'async' не компилируется? Я использую Microsoft Visual Studio 2012 (v4.5.50709).std :: async with std :: unique не компилируется

+0

'...' как автономный оператор недействителен C++, и вам не хватает некоторых '# include'. –

+0

@ Голосовые гонки на орбите Я просто не хочу повторять все известные коды. – user2431141

+0

Ваша идея того, что «все знают», субъективна и может содержать ошибки. Лучше всего оставить «...» полностью и написать правильные «# include», чтобы мы могли видеть, что вы знаете это правильно. В конце концов, вот почему вы пришли сюда, верно? –

ответ

2

Это должно работать в соответствии со стандартом, а это does work on gcc.

Причина, по которой это не удается на VS, вероятно, потому, что std::async разрешено хранить внутренние копии своих аргументов, которые затем будут переданы вызываемой функции в более поздней точке.

В этом случае, это потребует две ходы на unique_ptr: Один, чтобы построить промежуточный объект для асинхронной, а затем второй один при переходе аргумента к foo. Один из двух, вероятно, не работает. В Стандарте, однако, явно указано, что аргументы async должны быть только MoveConstructible (§ 30.6.8.2), который unique_ptr есть.

Поэтому я бы сказал, что это ошибка в реализации VS2012 стандартной библиотеки.

+0

Я даже не могу скомпилировать его на gcc 4.7.2. – user2431141

Смежные вопросы