До C++ 11 ваш код не был бы возможен: тип векторного элемента должен был быть CopyAssignable
, что означает возможность копирования и назначение. Обратите внимание, что если тип не отвечает этим требованиям, код плохо сформирован без необходимости диагностики; это дает компиляторам широту для принятия или отклонения.
С C++ 11 индивидуальные операции имеют свои собственные требования. Соответствующие требования к vector
являются (источник: C++ 14 Таблица 100):
emplace_back
: MoveInsertible
и MoveAssignable
insert
: CopyInsertable
и CopyAssignable
- конструктор:
EmplaceConstructible
Значения из этих признаков (примерно):
CopyInsertable
: есть копия-конструктор
MoveInsertable
: есть копировать-конструктор или переместить-конструктор (или оба)
CopyAssignable
: есть копировать-конструктор и копирование назначение оператора
MoveAssignable
: MoveInsertable
, и имеет копию оператор -assignment или переместить присваивание (или оба)
EmplaceConstructible
: есть конструктору
Обоснованием здесь заключается в том, что любая вставка может вызвать перераспределение памяти, которое требует, чтобы ваши объекты могли быть скопированы или перемещены. Однако Стандарт не требует, чтобы компилятор проверял, доступны ли конструктор или оператор присваивания, и использовать один, если другой нет. Вместо этого он указывает, что оба должны быть доступны.
Вы не указали, является ли ваш класс подвижным. Предполагая, что это не так, значит, вы не можете использовать какие-либо методы emplace или insert или любую другую функцию, которая может вызвать перераспределение.
Если вы создаете y
в то время, то вы можете инициализации использования конечно:
vector<int> y = x;
Если y
уже существует, так как ваш вопрос, кажется, предполагает, то вы почти не повезло: вы можете 't использовать любые функции вставки, поэтому вы можете изменять только существующие элементы. И поскольку нет оператора присваивания, вы не можете сделать это с помощью назначения.
Но вы можете использовать y.swap()
, как предложено в ответе Андрея.
Рассмотрите возможность добавления move-constructor и move-assign в свой класс или перепроектирование кода, чтобы вам не нужно было назначать y
. (Например, используйте указатель).
Если x.size() == y.size()
, то вы можете использовать размещение нового в последней инстанции хака:
for (size_t i = 0; i != y.size(); ++i)
{
y[i].~Foo();
new(&y[i]) Foo(x[i]); // copy-construct
}
Стандарт требует, чтобы 'T' быть копия назначаемые для' станд :: вектор :: Assign() 'работать, даже если VC++ неправильно делает not.Can вы объяснить, почему вы хотите класс 'Foo' не имеет оператора присваивания, но все же может копировать/назначать объекты типа' std :: vector '? –
Peter
@Peter Если 'T' имеет член const, он может быть сконструирован, но не назначен позже. Следовательно, может быть разумным определить конструктор копирования, но не оператор присваивания копии. Является ли это значимым (или полезным), зависит от приложения. – Andrew
Есть ли конструктор перемещения и оператор переадресации? –