Явное сравнение constexpr по умолчаниюC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Явное сравнение constexpr по умолчанию

Сообщение Anonymous »

После регрессии в GCC 13.3 мне пришлось добавить constexpr к операторам космического корабля по умолчанию в моей программе, и я заметил некоторые несоответствия в том, как компиляторы обрабатывают некоторый код в режиме C++20. Для краткости кода их можно отобразить в операторе сравнения на равенство ниже.
Пример №1:

Код: Выделить всё

struct A {
operator int() const;
};

struct B : A {
constexpr bool operator==(const B &) const = default;
};
это нормально для Clang и MSVC, но GCC с опцией -pedantic-errors жалуется здесь:

ошибка: вызов функции, отличной от constexpr, 'A::operator int() const' [-Winvalid-constexpr]

Пример №2 :

Код: Выделить всё

struct A {
bool operator==(const A &) const;
};

struct B : A {
constexpr bool operator==(const B &) const = default;
};
что подходит только для MSVC, в то время как Clang с параметром -pedantic-errors также начинает отклонять его с помощью

ошибка: определение по умолчанию оператора сравнения на равенство, который объявлен constexpr, но вызывает функцию сравнения, отличную от constexpr, является расширением C++23. [-Werror,-Wc++23-default-comp-relaxed-constexpr]

Оба примера кода действительны только в C++23, а не в C++23. допустимо в C++20?

Подробнее здесь: https://stackoverflow.com/questions/788 ... omparisons
Ответить

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

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

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

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

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