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

struct X{};

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

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

Почему, почему? Не существует operator== где-либо!

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

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

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

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

template<class T>
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'

Ответ 1

Какую версию MS VС++ вы используете?

Что бы это ни стоило, VС++ 11 Beta отклоняет ваш код с помощью:

trash.cpp(8): error C2893: Failed to specialize function template ''unknown-type' f(const T &)'
          With the following template arguments:
          'X'

Я не уверен, что я бы назвал наиболее полезным или информативным сообщением об ошибке, но он отклоняет код.

В сложившихся обстоятельствах, я думаю, что подача отчета об ошибке, вероятно, будет мало (если вообще). Ответ, который я ожидал, будет по существу: "Уже исправлено в VС++ 11. Обновляйте, когда сможете".