【发布时间】:2011-05-16 11:26:38
【问题描述】:
我遇到了一个很奇怪的症状。谁能告诉我根本原因是什么?
我的 VC++ 编译器版本是最新的:“Microsoft Visual C++ 2010 : 01019-532-2002102-70860”
重现步骤:
- 创建一个空的 win32 控制台项目
- 添加一个名为 main.cpp 的新 cpp 文件
- 将以下代码粘贴到 main.cpp 中
- 编译
- 编译器崩溃并报告以下消息:
\bug\main.cpp(54893757):致命错误 C1001:发生内部错误 在编译器中。 (编译文件 'msc1.cpp',第 1420 行)
要解决此问题,请尝试 简化或改变程序 在上面列出的位置附近。 请选择技术支持 Visual C++ 帮助菜单上的命令, 或打开技术支持帮助 文件以获取更多信息。
注入文本中出现此错误:
d:\bug\main.cpp(63) :参见参考 函数模板实例化 'XDummy Test(T)' 正在编译 [ T=int]
构建失败。
下面是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;
}
【问题讨论】:
-
如果您可以将代码减少到导致内部编译器错误的最少代码,请考虑在Microsoft Connect 提交错误报告。
-
使用这样的 auto 关键字似乎很糟糕/懒惰。我不想挖掘多个函数调用层来找出函数返回的类型。如果内部函数的返回类型发生变化,我宁愿在调用更改的函数时得到编译器错误,而不是向上两层,想知道发生了什么并不得不寻找连锁变化的原因(s )... 在定义局部迭代器变量时使用 auto 很方便,但在函数签名中使用它似乎是个坏主意。
-
@Leo Davidson:我也不喜欢 auto + decltype。但是,很多情况下,auto + decltype 是必不可少的。如果没有必要,我不会用它们来定义函数。
-
抱歉,我没有注意到同一行的“->”内容! Auto 在那里可能是完全合理的。
-
@Tomalak,很高兴 C++ 社区的进步,因为模板被归类为“基本”:)
标签: c++ compiler-construction crash compiler-errors visual-c++-2010