Может ли выражение с использованием указателей вызывать неопределенное (не неопределенное!) Поведение в контексте constexpr?

Согласно cppreference (выделение мое):

Выражение постоянной константы - это любое выражение, которое не имеет ни одного из следующих выражений в любом подвыражении.
(...)

  1. Выражение, оценка которого приводит к любой форме неопределенного поведения основного языка (включая целочисленное переполнение со знаком, деление на ноль, арифметику указателя вне границ массива и т. Д.). Обнаружено ли неопределенное поведение стандартной библиотеки, не определено.

С другой стороны, есть несколько выражений в указателях с результатом, который не является неопределенным, но не определен (см. [Expr.rel] / 3), например:

struct A {
    int v;
};

struct B {
    int v;
};

struct C: A, B {} c;

int main() {
    constexpr bool result = &c.A::v < &c.B::v;
    (void)result;
}

Код компилируется без проблем с gcc, но не в clang, который утверждает, что, несомненно, верно, что:

сравнение адресов подобъектов разных базовых классов не уточняется

Но (насколько я понимаю) согласно cppreference это не должно мешать компилятору компилировать код.

Какой компилятор прямо здесь - GCC или Clang? Я переоцениваю cppreference?

1 ответ

Решение

В дополнение к универсальному случаю, касающемуся UB, в конце списка запрещенных выражений в [expr.const] есть

- оператор отношения или равенства, где результат не указан

Это также появляется в списке cppreference, в настоящее время номер 19.

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