非常に奇妙な症状が発生しました。根本的な原因は誰に教えてくれますか?単純なコードをコンパイルするとVC++ 2010コンパイラがクラッシュするのはなぜですか?
マイVC++コンパイラのバージョン最新である: "のMicrosoft Visual C++ 2010:01019-532-2002102-70860" 再現する
ステップ:
- 空のWin32コンソールプロジェクト を作成します。
- main.cppという名前の新しいcppファイルを追加します。
- main.cppに次のコードを貼り付けます。
- コンパイル
- コンパイラがクラッシュし、レポートに次のメッセージ:バグの\ main.cppに(54893757)\
:致命的なエラー C1001:内部エラーがコンパイラで が発生しました。この問題を回避するには(コンパイラファイル 「msc1.cpp」、行1420)
は、上に挙げた場所の近くにプログラム を簡素化したり変更 を試してみてください。 Visual C++のヘルプメニュー コマンドを に選択するか、テクニカルサポートヘルプ ファイルを開いてください。
このエラーは注入テキストで発生:
D:\バグの\ main.cppに(63): 関数テンプレートのインスタンス 'XDummyテスト(T)' への参照がでコンパイルされる参照[ T = INT ]
ビルドFAILED。以下は
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](http://connect.microsoft.com/)にバグレポートを提出することを検討してください。 –
そのようなautoキーワードを使用すると、悪い/怠惰に思えます。関数が返す型を調べるために、複数の関数呼び出しレイヤを掘り起こす必要はありません。そして、内部関数の戻り値の型が変更された場合、私はむしろ、変更された関数が呼び出された時点でコンパイラエラーを取得し、何が起こったのか疑問に思って、ノックオン変更の原因を検索しなければなりません)... autoを使うと、ローカルイテレータ変数を定義するときに便利ですが、関数シグネチャでそれを使用することは悪い考えです。 –
@Leo Davidson:私はauto + decltypeも好きではありません。しかし、多くの場合、auto + decltypeは不可欠です。必要でない場合は、関数を定義するためにそれらを使用しません。 – xmllmx