【问题标题】:Why does the following code compile with MSVC++?为什么下面的代码用 MSVC++ 编译?
【发布时间】:2012-05-28 12:54:23
【问题描述】:
struct X{};

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

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

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

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

(注意: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'

【问题讨论】:

  • 其他编译器接受吗?
  • @Billy:不,添加了该信息。背景信息:我几乎对 MSVC 在 C++ 聊天室中所做的事情发疯了,几个小时后就放弃了。
  • 添加了一些背景信息。另外,匿名投反对票的人能否说出投反对票的原因?
  • 您是否在实际会被计算的地方尝试过相同的表达式?只是好奇..
  • 你真的是在问为什么编译器会出现错误

标签: c++ templates visual-c++ c++11 decltype


【解决方案1】:

您使用的是哪个版本的 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 中修复。可以升级。”

【讨论】:

  • 我在想我实际上是在使用 VS11 测试版......你有什么确切的版本?我的“版本 11.0.40825.2 PREREL”。
  • @Xeo:版本 11.0.50214.1 BETAREL"。如果我没记错的话,您拥有的是技术预览版而不是测试版。
  • 好吧,就这么多。将下载 real 测试版并稍后回来查看,谢谢。
  • @Xeo,其实最新版本是QRELB。这是BETAREL的自动更新:coolthingoftheday.blogspot.com/2012/04/…
猜你喜欢
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2017-11-09
相关资源
最近更新 更多