Нужен ли инициализатору элемента по умолчанию для std::vector полный тип?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Нужен ли инициализатору элемента по умолчанию для std::vector полный тип?

Сообщение Гость »


Разрешено ли стандартом C++ использовать инициализатор элемента по умолчанию для переменной-члена типа std::vector, где A — неполный тип?

Моя интуиция подсказывает, что полный тип должен требоваться только в том месте, где определены конструктор, деструктор или операторы присваивания. На практике это зависит от того, какой компилятор используется и компилируем ли мы с C++17 или C++20. Какой компилятор здесь прав? Что вызывает необходимость в полном типе, даже если конструктор/деструктор не определен в этом модуле компиляции?

#include структура А; структура Б { //std::vector vec; // хорошо std::vector vec{}; // gcc13: неудача; clang17: c++17 окей, c++20 не работает Б(); ~Б(); }; //структура А {}; // заставляет это работать в gcc13, но не в clang17 Может показаться излишним предоставлять инициализатор элемента по умолчанию в этой форме. Однако есть причина, по которой этот шаблон используется во всем нашем коде: мы используем предупреждение -Weffc++, потому что оно выявляет несколько ошибок, но оно имеет побочный эффект, заключающийся в принудительной явной инициализации всех переменных-членов либо в списке инициализации конструктора, либо в инициализатор члена по умолчанию. Последнее удобнее.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»