Я портирую существующий код для компиляции в gcc 4.7.2 и столкнулся со странной проблемой с nullptr. Мне удалось свести это к простому тестовому примеру:
#include <stdio.h>
const char* g_marker = "Original value";
void SetMarker( const char* s )
{
g_marker = s;
}
char* Test1()
{
return SetMarker( "I was here 1" ), nullptr;
}
char* Test2()
{
SetMarker( "I was here 2" );
return nullptr;
}
char* Test3()
{
return SetMarker( "I was here 3"), (char*)NULL;
}
int main()
{
char* returnValue = Test1();
printf( "%s\n", g_marker );
}
Скомпилируйте это с помощью g ++ test.cpp -o test -std = c ++ 0x.
Вывод, который я ожидаю, будет «Я был здесь 1», но я получаю «Исходное значение», указывая, что SetMarker никогда не вызывается.
Вызов либо Test2, либо Test3 дает ожидаемый результат.
Код, с которым я работаю, использует шаблон, который мы видели в Test3 — изначально без приведения перед NULL — который дал ошибку при недопустимом преобразовании из int в char *, поэтому я начал менять все эти NULL на nullptr. К сожалению, это не правильно.
Я, вероятно, вынужден изменить код для использования шаблона в Test2 (который я предпочитаю в любом случае), но мне любопытно узнать, является ли это ошибкой в компиляторе, или я что-то упустил.
Это ошибка в g ++: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988
g ++ отбрасывал побочные эффекты в выражениях типа nullptr_t
, при условии, что все nullptr_t
значения эквивалентны (которые они есть, но это не значит, что вы можете игнорировать побочные эффекты!)
Это исправлено в версии 4.8.0; В новых выпусках веток 4.x (4.6.4 и 4.7.3) также должно быть исправлено.
Других решений пока нет …