Я недавно установил Visual Studio 2010 Professional RC, чтобы опробовать его и протестировать несколько функций C ++ 0x, реализованных в VC ++ 2010.
Я создал std::vector
из std::unique_ptr
, без каких-либо проблем. Однако, когда я пытаюсь заполнить его, передав временные значения в push_back
, компилятор жалуется, что конструктор копирования unique_ptr
является закрытым. Я попытался вставить lvalue, переместив его, и он работает просто отлично.
#include <utility>
#include <vector>
int main()
{
typedef std::unique_ptr<int> int_ptr;
int_ptr pi(new int(1));
std::vector<int_ptr> vec;
vec.push_back(std::move(pi)); // OK
vec.push_back(int_ptr(new int(2))); // compiler error
}
Как оказалось, проблема не в unique_ptr
и vector::push_back
, а в том, как VC ++ разрешает перегрузки при работе со значениями, как показано в следующем коде:
struct MoveOnly
{
MoveOnly() {}
MoveOnly(MoveOnly && other) {}
private:
MoveOnly(const MoveOnly & other);
};
void acceptRValue(MoveOnly && mo) {}
int main()
{
acceptRValue(MoveOnly()); // Compiler error
}
Компилятор жалуется, что конструктор копирования недоступен. Если я сделаю это общедоступным, программа скомпилируется (хотя конструктор копирования не определен).
Я что-то не так понял относительно ссылок на rvalue, или это (возможно, известная) ошибка в реализации этой функции в VC ++ 2010?