Проблема с “подвижно-единственными типами” в VC ++ 2010

Я недавно установил Профессионала Visual Studio 2010 года RC, чтобы испытать его и протестировать некоторых C++ 0x опции, которые реализованы в VC ++ 2010.

Я инстанцировал a 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 ++ разрешает перегрузки при контакте с rvalues, как продемонстрировано следующим кодом:

struct MoveOnly
{
    MoveOnly() {}
    MoveOnly(MoveOnly && other) {}

private:

    MoveOnly(const MoveOnly & other);
};

void acceptRValue(MoveOnly && mo) {}

int main()
{
    acceptRValue(MoveOnly()); // Compiler error
}

Компилятор жалуется, что конструктор копии не доступен. Если я обнародовал его, компиляции программы (даже при том, что конструктор копии не определяется).

Я неправильно понимал что-то о rvalue ссылках, или действительно ли это (возможно известно) ошибка в VC ++ реализация 2010 года этой функции?

10
задан Luc Touraille 21 April 2010 в 12:31
поделиться

3 ответа

К сожалению, /Za глючит. Он выполняет проверку доступности elided-copy-constructor-accessibility, когда это не должно (привязка ссылок rvalue не вызывает конструкторы копирования, даже теоретически). В результате /Za не следует использовать.

Стефан Т. Лававей, разработчик библиотек Visual C++ (stl@microsoft.com)

12
ответ дан 3 December 2019 в 23:12
поделиться

Я заметил, что у меня отключены языковые расширения (\ Za). Когда расширения включены, код компилируется правильно. Я все еще думаю, что это ошибка, поскольку представленный здесь код является совершенно стандартным (насколько мне известно) и не зависит от каких-либо расширений Microsoft.

1
ответ дан 3 December 2019 в 23:12
поделиться

Прежде всего, вам нужно закрыть ) :

vec.push_back (int_ptr (new int (2)) ) ; // ошибка компилятора

Теперь у меня нет ошибки компилятора ни в первом, ни во втором случае.

Я использую Visual Studio 2010 Beta.

1
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: