Как инициализировать векторный элемент по умолчанию?

#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 скомпилирован и связан, и эти шаги уже оценивают код.