Рассмотрим следующее:
template<typename T>
struct C {};
template<typename T, typename U>
void operator +(C<T>&, U);
struct D: C<D> {};
struct E {};
template<typename T>
void operator +(C<T>&, E);
void F() { D d; E e; d + e; }
Этот код компилируется как на GCC-7, так и на Clang-5. Выбранная перегрузка для operator +
- это значение struct E
.
Теперь, если происходит следующее изменение:
/* Put `operator +` inside the class. */
template<typename T>
struct C {
template<typename U>
void operator +(U);
};
то есть если operator +
определяется внутри шаблона класса, а не наружу, то Clang дает двусмысленность между тем, что operator +
присутствует в коде. GCC по-прежнему компилируется.
Почему это происходит? Это ошибка в GCC или Clang?