Может ли выражение с использованием указателей вызывать неопределенное (не неопределенное!) Поведение в контексте constexpr?
Согласно 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;
}
Код компилируется без проблем с gcc, но не в clang, который утверждает, что, несомненно, верно, что:
сравнение адресов подобъектов разных базовых классов не уточняется
Но (насколько я понимаю) согласно cppreference это не должно мешать компилятору компилировать код.
Какой компилятор прямо здесь - GCC или Clang? Я переоцениваю cppreference?
1 ответ
В дополнение к универсальному случаю, касающемуся UB, в конце списка запрещенных выражений в [expr.const] есть
- оператор отношения или равенства, где результат не указан
Это также появляется в списке cppreference, в настоящее время номер 19.