Компилятор не использует 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
,