Выражение значения C++ с деструктором генерирует предупреждение C4701 в Visual Studio 2010

Следующий код C++, компилируется без предупреждения в Visual Studio 2010:


extern void callFunc( int, int );

struct str_wrapper
{
 str_wrapper();
};

extern bool tryParseInt( const str_wrapper& str, int& outValue );

void test()
{
 int x, y;
 if ( tryParseInt( str_wrapper(), x ) && tryParseInt( str_wrapper(), y ) )
 {
  // No warning generated
  callFunc( x, y );
 }
}

Однако если str_wrapper имеет определяемый пользователем деструктор, код генерирует предупреждение в строке callFunc(x, y):

    предупреждение C4701: потенциально неинициализированная локальная переменная 'y' используется.


extern void callFunc( int, int );

struct str_wrapper { str_wrapper(); ~str_wrapper(); ///< Causes warning C4701 below };

extern bool tryParseInt( const str_wrapper& str, int& outValue );

void test() { int x, y; if ( tryParseInt( str_wrapper(), x ) && tryParseInt( str_wrapper(), y ) ) { // C4701 generated for following line callFunc( x, y ); } }

Я был бы счастлив, если бы оба примера генерировали предупреждение, или если ни один из примеров не генерировал предупреждение. Я пропускаю какое-то неясное правило C++ или это ошибка компилятора?

1 ответ

К сожалению, я не смог воспроизвести это предупреждение с помощью предоставленного кода. Тем не менее, я предполагаю, что компилятор генерирует его из-за функции языка оценки короткого замыкания.

X всегда должен быть "инициализирован" в функции tryParseInt, но "инициализация" Y зависит только от логического результата предыдущего вызова tryParseInt(str_wrapper(), x). Но да, все равно не имеет никакого смысла, почему было сгенерировано предупреждение для строки внутри блока if. Может, компилятор сам себя обманул?

Другие вопросы по тегам