Выражение значения C ++ с деструктором генерирует предупреждение C4701 в Visual Studio 2010 - PullRequest
4 голосов
/ 14 июля 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):

<code>
extern void callFunc( int, int );</p>

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

<p>extern bool tryParseInt( const str_wrapper& str, int& outValue );</p>

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

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

1 Ответ

1 голос
/ 15 июля 2010

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

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

...