具有bool属性的条件下的内部编译器错误

时间:2015-05-05 03:50:49

标签: c++ c++builder c++builder-xe5

最近我遇到了一个奇怪的问题,一个简单的来源不想编译。我在许多网站寻找解决方案(和原因),但没有良好的效果(除了错误报告,但我没有找到直接原因)。

下面我提供简单的代码来重现这种情况:

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;
}

编译器无法在main函数中编译第一个条件。其他等效条件的陌生人编译成功完成。

这是我在发布编译期间的行为。重现我使用过Embarcadero®C++Builder®XE5版本19.0.13476.4176

  

错误消息:[bcc32致命错误] File1.cpp(43):F1004内部   编译器错误位于0x14470090,基址为0x14410000

有人知道上面例子中有什么问题吗?也许带有属性机制的使用模板是原因?

1 个答案:

答案 0 :(得分:0)

在我的情况下,简单的解决方案似乎是Get方法中的问题条件。当我改变

if( m_ptr == NULL )

到等效形式

if( !m_ptr )

一切都编译没有错误。

我在这里写这篇文章因为我想分享我的见解 - 这对某些人来说很有帮助。