Использование операторов if и инициализации объекта класса в вашем примере имеет тенденцию затенять релевантный момент: объявления во внутренних областях являются абсолютно допустимыми и скрывают объявления с одинаковыми именами во внешних областях.
Aвозможно, более ясный пример:
#include <iostream>
int main() {
const int x = 10;
std::cout << "outer x is " << x << "\n";
{
const double x = 12.34;
std::cout << " inner x is " << x << " (it hides the outer x)\n";
}
std::cout << "outer x is still " << x << " (inner x no longer exists)\n";
}
Вывод:
outer x is 10
inner x is 12.34 (it hides the outer x)
outer x is still 10 (inner x no longer exists)
Обратите внимание, что внутренние и внешние x
s даже не относятся к одному и тому же типу.
Хотя это законно, обычно это не очень хорошая идея;у компилятора с этим нет проблем, но это может сбить людей с толку.Если вы скомпилируете с g++ -Wshadow
, вы получите предупреждение:
c.cpp: In function ‘int main()’:
c.cpp:6:22: warning: declaration of ‘x’ shadows a previous local
c.cpp:3:15: warning: shadowed declaration is here