11
struct X{};

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

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

为什么,只是为什么任何地方都没有operator==定义!

我真的很想了解这里发生了什么,以提供有关 MS Connect 的详细错误报告。我的疯狂之旅始于Lounge<C++> 聊天室……

(注意:GCC和 Clang 都不接受此代码。)

哦,顺便说一句,添加私有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'
4

1 回答 1

7

您使用的是什么版本的 MS VC++?

无论价值如何,VC++11 Beta 都会拒绝您的代码:

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

我不确定这是否是我所说的最有用或信息最丰富的错误消息,但它拒绝了代码。

在这种情况下,我猜提交错误报告可能收效甚微(如果有的话)。我期望的响应基本上是:“已经在 VC++11 中修复。尽可能升级。”

于 2012-05-22T03:11:44.437 回答