Может ли выражение с использованием указателей вызывать неопределенное (не неопределенное!) Поведение в контексте 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;
}

Код компилируется без проблем с НКУ но не в лязг в котором говорится, что, несомненно, правда, что:

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

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

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

6

Решение

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

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]