Я экспериментировал с использованием произвольных функций в выражениях свертки, когда нашел следующий код, который компилируется с помощью 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
? Или прописанный эквивалент выражения сгиба не совсем эквивалентен?