4

次の 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++ ルールが欠けているのでしょうか、それともコンパイラのバグですか?

4

1 に答える 1

1

残念ながら、提供されたコードでその警告を再現できませんでした。ただし、短絡評価言語機能のために、コンパイラがそれを生成すると思います。

X は、tryParseInt 関数で常に「初期化」する必要がありますが、Y の「初期化」は、前の tryParseInt(str_wrapper(), x) 呼び出しからのブール値の結果のみに依存します。しかし、はい、if ブロック内の行に対して警告が生成された理由はまだ意味がありません。たぶん、コンパイラは自分自身をだましましたか?

于 2010-07-14T20:15:52.513 に答える