Внутренняя ошибка компилятора в состоянии со свойством bool

В последнее время я столкнулся со странной проблемой, которую простой источник не хотел компилировать. Я искал решения (и причины) на многих сайтах, но без хороших результатов (кроме сообщений об ошибках, но я не нашел там прямой причины).

Ниже я представляю простой код для воспроизведения этой ситуации:

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 Fatal Error] File1.cpp (43): F1004 Internal
ошибка компилятора в 0x14470090 с базой 0x14410000

Кто-нибудь знает, в чем проблема в приведенном выше примере? Может быть, использование шаблонов с механизмом свойств является причиной?

2

Решение

В моем случае это простое решение, это кажется проблемным условием внутри метода Get. Когда я меняюсь

if( m_ptr == NULL )

в эквивалентной форме

if( !m_ptr )

все компилируется без ошибок.

Я пишу об этом здесь, потому что я хотел бы поделиться своими мыслями — это может быть полезно для кого-то.

0

Другие решения


По вопросам рекламы [email protected]