このコードは、悪い習慣として扱われるべきだと私が考えるものを示しており、変数の再定義またはマスクに関するコンパイラからの警告を引き出します。
#include <iostream>
int *a;
int* f()
{
int *a = new int;
return a;
}
int main()
{
std::cout << a << std::endl << f() << std::endl;
return 0;
}
その出力 (g++ でコンパイル):
0
0x602010
私はいくつかの参考文献 (Stroustrup と The Complete C++ Reference) を見てきましたが、これが許可される時期と理由については何も見つかりません。ただし、それが単一のローカルスコープ内にないことは知っています。
いつ、なぜこれが許可されるのですか? この構造の良い用途はありますか? どうすればg ++に警告してもらうことができますか? 他のコンパイラはそれについて不平を言っていますか?