В соответствии с cppreference (выделение мое):
Основной константой выражения является любое выражение, которое не имеет каких-либо
одно из следующего в любом подвыражении
(…)
- Выражение, оценка которого приводит к любая форма основного языка
неопределенное поведение (включая целочисленное переполнение со знаком, деление на
ноль, арифметика указателя вне границ массива и т. д.). Будь стандартным
Неопределенное поведение библиотеки обнаружено не определено.
С другой стороны, есть несколько выражений в указателях с результатом, который не является неопределенным, но неопределенные (Ср [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?
В дополнение к универсальному случаю, касающемуся UB, в конце списка запрещенных выражений в [expr.const] есть
— оператор отношения или равенства, где результат не указан
Это также появляется в списке cppreference, в настоящее время номер 19.
Других решений пока нет …