Я экспериментировал с использованием произвольных функций в выражениях сгиба, когда нашел следующий код, который компилируется с gcc
, но не компилируется с clang
.
enum Enum {
A = 3,
B = 8,
C = 5
};
namespace EnumMax {
constexpr Enum operator>>=(const Enum left, const Enum right) {
return left < right ? right : left;
}
}
template<Enum ... enums>
constexpr Enum max() {
using EnumMax::operator>>=;
return (enums >>= ...);
}
constexpr Enum max_v = max<A, B, C>();
https://godbolt.org/z/-LOudM
Похоже, что clang
не учитывает перегруженный оператор, но пытается использовать обычный оператор >>=
в выражении сгиба.
Однако, если вместо этого указано выражение сгиба, clang
учитывает перегруженный оператор и прекрасно скомпилирует:
constexpr Enum maxExplicit() {
using EnumMax::operator>>=;
return (A >>= (B >>= C));
}
Это ошибка clang
?Или записанный эквивалент выражения сгиба не совсем эквивалентен?