Следующий код вызывает у нас небольшую головную боль: clang и MSVC принимают следующий код, а GCC отвергает его. Мы полагаем, что GCC прав на этот раз, но я хотел убедиться, что перед подачей отчетов об ошибках. Итак, существуют ли какие-либо специальные правила для поиска operator[]
, о которых я не знаю?
struct X{};
struct Y{};
template<typename T>
struct B
{
void f(X) { }
void operator[](X){}
};
template<typename T>
struct C
{
void f(Y) { }
void operator[](Y){}
};
template<typename T> struct D : B<T>, C<T> {};
int main()
{
D<float> d;
//d.f(X()); //This is erroneous in all compilers
d[Y()];//this is accepted by clang and MSVC
}
Итак, приведенный выше код является правильным при разрешении вызова operator[]
в функции main
?