#c #constructor #initialization #stdvector #push-back
#c #конструктор #инициализация #stdvector #возврат
Вопрос:
Допустим, у меня есть класс X
, который не имеет конструктора какого-либо типа, кроме неявного конструктора по умолчанию:
class X
{
public:
int value;
X(void) = default;
X(int) = delete;
X(const Xamp;) = delete;
X(Xamp;amp;) = delete;
};
Когда я создаю вектор из этого, std::vector<X>
, и пытаюсь добавить к push_back(X())
emplace_back()
нему элемент, программа не будет компилироваться, потому что она пытается использовать конструктор перемещения (из того, что я понимаю из описания ошибки).
C2280 ‘X::X(X amp;amp;)’: попытка сослаться на удаленную функцию
Как я могу создать push_back
или emplace_back
использовать конструктор по умолчанию?
Комментарии:
1. Изменение размера потребует перемещения существующих элементов.
2. Из std::vector::emplace_back «T (тип элемента контейнера) должен соответствовать требованиям MoveInsertable и EmplaceConstructible » .
3. «вектор пытается перераспределить себя в другом месте кучи?» это определено реализацией. В стандарте даже не упоминается «куча» . Но требования определены в стандарте, и одним из требований является конструктор копирования.
4. «Да». (и даже если ваша емкость достаточно хороша, код для ее обработки все равно создается).
5. Создание экземпляра класса из шаблона
std::vector
генерирует код, содержащий вызов конструктора копирования. Даже если вы не будете вызывать конструктор копирования во время выполнения, компилятор или компоновщик прервется с ошибкой. C не является языком сценариев, где код оценивается во время выполнения. C скомпилирован и связан, и эти шаги уже оценивают код.