Почему следующий код компилируется с помощью MSVC++?

struct X{};

template
decltype(X() == int()) f(T const&){ return true; }

int main(void) {
  X x;
  f(x);
}

Почему, только почему? Нет оператора == , определенного нигде !

Я действительно хочу понять, что здесь происходит, чтобы предоставить подробный отчет об ошибках в MS Connect. Мое путешествие к безумию началось где-то здесьв чате Lounge...

(Примечание: ни GCC, ни Clang не принимают этот код.)

О, да! и кстати, добавление частного X(int)ctor приводит к сбою компиляции:

struct X{
    X(){}
private:
    X(int);
};

template
decltype(X() == int()) f(T const&){ return true; }

int main(void) {
  X x;
  f(x);
}

Вывод:

1>src\main.cpp(12): error C2248: 'X::X' : cannot access private member declared in class 'X'
1>          src\main.cpp(4) : see declaration of 'X::X'
1>          src\main.cpp(1) : see declaration of 'X'
11
задан Xeo 22 May 2012 в 03:01
поделиться