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