为什么VC++ 2010编译器在编译简单代码时会崩溃?

xml*_*lmx 8 c++ compiler-construction crash compiler-errors visual-c++-2010

我遇到了一个非常奇怪的症状.谁能告诉我根本原因是什么?

我的VC++编译器版本是最新的:"Microsoft Visual C++ 2010:01019-532-2002102-70860"

重现步骤:

  1. 创建一个空的win32控制台项目
  2. 添加一个名为main.cpp的新cpp文件
  3. 将以下代码粘贴到main.cpp中
  4. 编译器崩溃并报告以下消息:

\ bug\main.cpp(54893757):致命错误C1001:编译器中发生内部错误.(编译器文件'msc1.cpp',第1420行)

若要解决此问题,请尝试简化或更改上面列出的位置附近的程序.请在Visual C++帮助菜单上选择技术支持命令,或打开技术支持帮助文件以获取更多信息.

注入文本中发生此错误:

d:\ bug\main.cpp(63):参见使用[T = int]编译的函数模板实例化'XDummy Test(T)'的引用

建立失败.

以下是main.cpp的源代码:

#include <vector> 

template<class It_> 
struct trait_dummy 
{ 
    static const int value = std::tr1::is_convertible<typename iterator_traits<It_>::iterator_category, int>::value;     
}; 

template<class It_> 
class X 
{ 
public: 
    template<class T_> 
    X(T_& rColl) 
    {} 
}; 

template<class T_> 
X<typename T_::iterator> f(T_ rColl, std::false_type) 
{ 
    return X<typename T_::iterator>(rColl); 
} 

template<class T_> 
auto f(T_& rColl) -> decltype(f(rColl, std::false_type())) 
{ 
    return f(rColl, std::false_type()); 
} 

template<class It_> 
X<It_> f(It_ first, size_t nSize, typename std::tr1::enable_if<trait_dummy<It_>::value>::type* dummy = 0) 
{ 
    return X<It_>(first, first + nSize); 
} 

class XTest 
{ 
public: 
    void foo() 
    { 
        auto v = f(m_Suite); 
    }    

    std::vector<int> m_Suite; 
}; 

const int g_dummy = 0; 
class XDummy 
{ 
public: 
    XDummy(int, int, int, int dummy = g_dummy) 
    {} 
}; 

template<class T> 
XDummy Test(T) 
{    
    return XDummy(0, 0, 0); 
} 

int main() 
{ 
    Test(0); 
    //XTest().foo(); 

    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 5

你自己尝试过任何类型的故障排除吗?

我可以使用您描述的上述源代码重现崩溃.当然,我收到了一些警告:

  • "IntelliSense:没有重载函数的实例"f"匹配参数列表"
  • "智能感知:函数调用中的参数太少"

两者都指这一行:

auto v = f(m_Suite); 
Run Code Online (Sandbox Code Playgroud)

几秒钟的故障排除发现,通过注释掉整个XTest类,代码编译并执行没有问题(最重要的是,不会崩溃编译器).这告诉我(并且应该告诉你)问题显然在XTest课堂的某个地方.
您不禁想知道这是否与正在生成的编译器错误有关.

那么,如果我们只是注释掉产生编译器错误的单行怎么样?你知道什么!代码编译并执行得很好!

所以在大约一分钟之内,我们已经将罪魁祸首缩小到一行代码.实际上,我不会花时间准确地理解你的所有代码所做的事情,因为我认为你可以从这里开始,因为你知道在哪里集中你的努力.首先修复这些IntelliSense错误,看看你的代码是否编译而不会崩溃编译器.

  • 关于无效代码崩溃编译器的IMO有趣的事情不是代码无效,而是它崩溃了编译器:) (3认同)
  • 另一个重要的一点是,编译器会针对一大堆有效的源代码进行测试,这些源代码可以测试语言的每个角落.但是没有测试套件可以声称它测试*所有*可能的无效代码. (3认同)