Компилятор не использует Move C'or / назначение операции?

Простой вопрос на самом деле. Что происходит в следующем примере кода, который приводит к тому, что он не компилируется?

Ошибка возникает в первой строке main():

"Использование удаленной функции"std::__atomic0::...__atomic_base(...)")"

#include <atomic>
#include <deque>
#include <vector>

using namespace std;

class Test {
public:
    deque<atomic_int> dq;
    Test(){}
};


int main(){
    vector<Test> v = { Test(), Test() };

    return 0;
}

Я собираю его как код C++0x, в котором я понимаю, atomic типы может быть не могут быть скопированы? Но в любом случае, линия vector<Test> v = { Test(), Test() }; должен вызывать конструктор перемещения по умолчанию / оператор присваивания Test, который должен вызывать конструктор перемещения / оператор присваивания Test::dq, избегая необходимости копировать любые atomic_int,

Так почему бы не скомпилировать?

РЕДАКТИРОВАТЬ

Мой компилятор позволит мне добавлять неподвижные объекты в контейнер, а затем перемещать контейнер. Увидеть ниже:

class Test {
public:
    deque<atomic_int> dq;
    Test(){
        dq.resize(10);
    }
};


int main(){
    Test t1;
    Test t2(std::move(t1));

    return 0;
}

Ход выполняется на t1, который вызывает движение t1членов, один из которых является deque, Таким образом, движение каждого члена в deque происходит, ни один из которых не имеет типа atomic_int

1 ответ

Решение

Начиная с C++11, наличие контейнера только для конструируемых объектов по умолчанию совершенно законно, при условии, что вы не используете никаких операций, требующих копирования или перемещения объекта.

Тем не мение, std::initializer_list позволяет только const доступ к его элементам, что означает, что вы не можете от них уйти. следовательно

vector<Test> v = { Test(), Test() };

будет пытаться скопировать Test, который не действителен, потому что он будет пытаться скопировать deque,

Другие вопросы по тегам