Использование std:: move для отправки std:: unique_ptr в std:: thread в VS1012

Ниже приведена ошибка в visual studio 2012.

void do_something(std::unique_ptr<int> i);
std::unique_ptr<int> i(new int);
std::thread(do_something, std::move(i));

Ошибка 3 ошибки C2248: 'std:: unique_ptr < _Ty > :: unique_ptr': не может получить доступ к закрытому члену, объявленному в классе 'std:: unique_ptr < _Ty > ' c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152 1 scratch Это полезно (!), Указывая на это определение в функциональном: _VARIADIC_EXPAND_0X (_CLASS_BIND,,)

Это нормально:

do_something(std::move(i));

Что я делаю неправильно?

Ответ 1

Что я делаю неправильно?

Почти ничего. Фактически, ваша программа является законной и ее поведение четко определено.

Ошибка компилятора, которую вы получаете, обязательно является ошибкой в ​​реализации стандартной библиотеки, которая поставляется вместе с вашим компилятором, возможно, связана с тем, что VC11 не поддерживает вариативные шаблоны, а макробная техника, используемая для подделки, - это не идеально.

Это говорит о том, что даже если ваша программа скомпилировалась, вам все равно придется присоединиться к вашему потоку или отсоединиться от него до того, как обломок std::thread RAII будет уничтожен - возникает исключение, если деструктор std::thread вызывается, пока инкапсулированная нить все еще работает (если только она не была отсоединена).