Можно ли заранее объявить функцию, принимающую вектор неполного типа со значением по умолчанию? ⇐ C++
Можно ли заранее объявить функцию, принимающую вектор неполного типа со значением по умолчанию?
Приведенный ниже фрагмент кода демонстрирует реальную проблему, с которой я недавно столкнулся в своей программе:
#include класс А; void f( const std::vector & = {}); Существует неполный класс A и объявление функции, принимающее vector из A с пустым значением по умолчанию. И функция даже нигде не вызывается.
Он отлично работает и в GCC, и в Clang 14, но начиная с Clang 15 появляется ошибка:
В файле, включенном из :1: /opt/compiler-explorer/clang-15.0.0/bin/../include/c++/v1/vector:540:52: ошибка: арифметика по указателю на неполный тип "A" {return static_cast(__end_cap() - this->__begin_);} ~~~~~~~~~~~ ^ /opt/compiler-explorer/clang-15.0.0/bin/../include/c++/v1/vector:760:56: примечание: при создании экземпляра функции-члена запрашивается 'std::vector::capacity' здесь __annotate_contigious_container(data(), data() + емкость(), ^ /opt/compiler-explorer/clang-15.0.0/bin/../include/c++/v1/vector:431:7: примечание: при создании экземпляра функции-члена запрашивается 'std::vector::__annotate_delete' здесь __annotate_delete(); ^ :5:32: примечание: при создании экземпляра функции-члена 'std::vector::~vector', запрошенной здесь void f( const std::vector & = {}); ^ :3:7: примечание: предварительное объявление «A» класс А; ^ Онлайн-демо: https://godbolt.org/z/a8xzshbzP
Правильны ли новые версии Clang, отвергая программу?
Приведенный ниже фрагмент кода демонстрирует реальную проблему, с которой я недавно столкнулся в своей программе:
#include класс А; void f( const std::vector & = {}); Существует неполный класс A и объявление функции, принимающее vector из A с пустым значением по умолчанию. И функция даже нигде не вызывается.
Он отлично работает и в GCC, и в Clang 14, но начиная с Clang 15 появляется ошибка:
В файле, включенном из :1: /opt/compiler-explorer/clang-15.0.0/bin/../include/c++/v1/vector:540:52: ошибка: арифметика по указателю на неполный тип "A" {return static_cast(__end_cap() - this->__begin_);} ~~~~~~~~~~~ ^ /opt/compiler-explorer/clang-15.0.0/bin/../include/c++/v1/vector:760:56: примечание: при создании экземпляра функции-члена запрашивается 'std::vector::capacity' здесь __annotate_contigious_container(data(), data() + емкость(), ^ /opt/compiler-explorer/clang-15.0.0/bin/../include/c++/v1/vector:431:7: примечание: при создании экземпляра функции-члена запрашивается 'std::vector::__annotate_delete' здесь __annotate_delete(); ^ :5:32: примечание: при создании экземпляра функции-члена 'std::vector::~vector', запрошенной здесь void f( const std::vector & = {}); ^ :3:7: примечание: предварительное объявление «A» класс А; ^ Онлайн-демо: https://godbolt.org/z/a8xzshbzP
Правильны ли новые версии Clang, отвергая программу?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как превратить функцию аргумента на основе cli в функцию, принимающую параметры Python
Anonymous » » в форуме Python - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как превратить функцию аргумента на основе cli в функцию, принимающую параметры Python
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как написать функцию C++20, принимающую диапазон как с T, так и с const T?
Anonymous » » в форуме C++ - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-