Имеет ли GCC11 регрессию, в которой он неправильно принимает указатель на массив абстрактного класса

В GCC 4–10 и Clang (все версии) этот фрагмент кода не компилируется, поскольку компилятор не может выделить память для A, поскольку A является абстрактным:

class A {
    virtual void f() = 0;
};

void f(A (*)[1]) {}

Однако в GCC11+ это успешно компилируется.

Эта идиома полезна для обнаружения абстрактного класса до C++11, и Boost действительно использует ее для своей библиотеки type_traits.

Я что-то пропустил или это регресс в компиляторе?

Я не думаю, что стандарт будет отключать такое объявление, может быть, оно просто не определено? (и то и другое правильно)

apple apple 15.02.2023 20:22

Кстати, код не выделяет массив указателей, это один указатель на массив.

apple apple 15.02.2023 20:22

Я не понимал значения скобок вокруг (*) до сегодняшнего дня. Узнал что-то новое, спасибо. Название вопроса отредактировано, чтобы отразить это новое понимание.

Ho Cheung 15.02.2023 21:09

@HoCheung, это все еще неправильно, указатель ничего не выделяет (кроме самого указателя).

apple apple 15.02.2023 21:40

Я не понимаю. Как бы вы это сформулировали?

Ho Cheung 15.02.2023 21:44

@HoCheung между прочим, это происходит не только в параметре godbolt.org/z/x9zW67jnv

apple apple 15.02.2023 21:49

Название @HoCheung отредактировано, дело в том, что указатель не выделяет какой-либо массив, поэтому сказать, что это так, было бы неправильно.

apple apple 15.02.2023 21:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

P0929R2 изменил правила, чтобы больше не было неправильным упоминать тип «массив X», где X — тип абстрактного класса. (Конечно, такой тип никогда не может быть создан.) Это изменение было сделано, потому что было довольно глупо, что вам было разрешено упоминать тип «массив X», когда X неполный, только для того, чтобы позже определить X как абстрактный класс. type и, таким образом, вызвать ошибку компиляции в точке определения.

Поскольку это изменение было одобрено как отчет о дефектах на собрании в Рапперсвиле (июнь 2018 г.), более новые версии компиляторов должны применять новые правила во всех языковых версиях (что в данном случае означает вплоть до C++98).

Другие вопросы по теме

Похожие вопросы

Явное создание объектов с помощью тривиального конструктора по умолчанию с использованием нового размещения в C++17
Каков наиболее ресурсоэффективный способ проверить, содержат ли два списка std::list одинаковые уникальные элементы?
С++: получение случайных символов в качестве вывода, не знаю, почему
Unordered_map из собственного типа путем перегрузки оператора() не работает
Измерение вертикального расстояния бинаризованного изображения (Open CV) C++
Можно ли автоматически сопоставлять и перенаправлять типы в контексте структуры на параметры функции с помощью шаблонов C++?
Программа для поиска абсолютных псевдопростых чисел Эйлера
Как добавить библиотеку {fmt}?
Структурированная привязка для диапазона фиксированного размера
Удаленный конструктор перемещения в базовом классе не останавливает возврат объекта производного класса из функции