Явное сравнение 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

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