Может выражение с помощью указателей, вызывающих неопределенное (не неопределенное!) поведение используется в контексте таких?


Согласно cppreference (Курсив мой):

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

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

С другой стороны, существует несколько выражений на указателях с результатом, который не является неопределенным, но неопределенным (ср. [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 6

1 ответ:

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

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

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