【发布时间】:2015-05-05 03:50:48
【问题描述】:
最近我遇到了一个奇怪的问题,一个简单的源不想编译。我在许多站点中寻找解决方案(和原因),但效果不佳(错误报告除外,但我没有找到直接原因)。
下面我提供简单的代码来重现这种情况:
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 Internal 0x14470090 处的编译器错误,基数为 0x14410000
有人知道上面的例子有什么问题吗?也许是带有属性机制的使用模板?
【问题讨论】:
-
应始终向编译器供应商/供应商报告 ICE。这意味着编译器认识到出了问题。根据定义,它不应该发生。供应商可能想要修复它,特别是如果您有一个小的干净复制品(MCVE (How to create a Minimal, Complete, and Verifiable Example?) 是 Stack Overflow 使用的术语)。他们最渴望在当前版本中修复它;由于您的编译器版本更古老,他们将不太热衷于修复它,除非它也会在当前版本中引起问题。
-
只是好奇 - 你为什么要重新发明
std::auto_ptr/std::unique_ptr而不是按原样使用它们? -
@Remy Lebeau 是的,你说得对,但这并不取决于我。我在更大的团队中工作,该团队维护着相当旧的应用程序。许多机制是多年前编写的,并且多年来一直没有任何问题。最近团队的同事写了新功能导致编译问题。在调试时,我得出的结论是条件是原因。请记住,上面的代码只是重现这种情况的简单示例。我的同事当然知道存在智能指针,但我认为这与该主题无关 :)
标签: c++ c++builder c++builder-xe5