Нужен ли инициализатору элемента по умолчанию для std::vector полный тип? ⇐ 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++, потому что оно выявляет несколько ошибок, но оно имеет побочный эффект, заключающийся в принудительной явной инициализации всех переменных-членов либо в списке инициализации конструктора, либо в инициализатор члена по умолчанию. Последнее удобнее.
Разрешено ли стандартом C++ использовать инициализатор элемента по умолчанию для переменной-члена типа std::vector, где A — неполный тип?
Моя интуиция подсказывает, что полный тип должен требоваться только в том месте, где определены конструктор, деструктор или операторы присваивания. На практике это зависит от того, какой компилятор используется и компилируем ли мы с C++17 или C++20. Какой компилятор здесь прав? Что вызывает необходимость в полном типе, даже если конструктор/деструктор не определен в этом модуле компиляции?
#include структура А; структура Б { //std::vector vec; // хорошо std::vector vec{}; // gcc13: неудача; clang17: c++17 окей, c++20 не работает Б(); ~Б(); }; //структура А {}; // заставляет это работать в gcc13, но не в clang17 Может показаться излишним предоставлять инициализатор элемента по умолчанию в этой форме. Однако есть причина, по которой этот шаблон используется во всем нашем коде: мы используем предупреждение -Weffc++, потому что оно выявляет несколько ошибок, но оно имеет побочный эффект, заключающийся в принудительной явной инициализации всех переменных-членов либо в списке инициализации конструктора, либо в инициализатор члена по умолчанию. Последнее удобнее.
Мобильная версия