Может выражение с помощью указателей, вызывающих неопределенное (не неопределенное!) поведение используется в контексте таких?
Согласно cppreference (Курсив мой):
Основным постоянным выражением является любое выражение, которое не имеет одно из следующих в любом подвыражении
(...)
- выражение, оценка которого приводит к любой форме основного языка неопределенное поведение (включая переполнение целого числа со знаком, деление на ноль, арифметика указателя вне границ массива и т. д.). Стандарт ли библиотека неопределенного поведения обнаружена 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?