最近、単純なソースをコンパイルしたくないという奇妙な問題に直面しました。私は多くのサイトで解決策(および原因)を探していましたが、良い効果はありませんでした(バグレポートを除くが、直接の原因は見つかりませんでした).
以下に、その状況を再現するための簡単なコードを示します。
struct Foo {
Foo() : m_x( true ) {}
__property bool x = { read=m_x };
private:
bool m_x;
};
template<typename T>
struct TMyPointer {
T * m_ptr;
TMyPointer( T * ptr ) : m_ptr( ptr ) {}
~TMyPointer()
{
delete m_ptr;
}
T * operator->() const
{
return Get();
}
T * Get() const
{
if( m_ptr == NULL )
; // some error handling
return m_ptr;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
TMyPointer<Foo> bar( new Foo );
if( bar->x && 1 == 1 ) ; // Failed
if( 1 == 1 && bar->x ) ; // OK
if( !!bar->x && 1 == 1 ) ; // OK
if( bar->x == true && 1 == 1 ) ; // OK
if( (bar->x) && 1 == 1 ) ; // OK
return 0;
}
コンパイラは、メイン関数内の最初の条件をコンパイルできませんでした。他の同等の条件の奇妙なコンパイルが正常に終了しました。
これは、リリースのコンパイル中にのみ行う動作です。再現するために、Embarcadero® C++Builder® XE5 バージョン 19.0.13476.4176 を使用しました
エラー メッセージ: [bcc32 致命的なエラー] File1.cpp(43): F1004 ベース 0x14410000 の 0x14470090 で内部コンパイラ エラーが発生しました
上記の例で何が問題なのか誰でも知っていますか? プロパティメカニズムを備えた使用テンプレートが原因でしょうか?