Выражение значения 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. Может, компилятор сам себя обманул?