Ответить, когда это разрешено: в основном в любых двух вложенных областях.
Например:
void foo() {
int a;
{
int a;
}
}
class Base {
int a;
};
class Derived: public Base {
int a; // Yes, the name Base::a is visible in the scope of Derived, even if private
};
class Foo() {
int a;
Foo(int a) : a(a) { } // Works OK
};
using std::swap;
void swap(MyClass& lhs, MyClass& rhs);
// Not strictly a variable, but name lookup in C++ happens before determining
// what the name means.
Теперь ответ должен быть однозначным: обычно допускается наличие двух «вещей» с одним именем в одной и той же области. Это возможно, потому что самое большее одно из имен фактически определено в этой области; другие были бы просто видимыми в этой области. Правила разрешения имен определяют, какое имя выбрано, если есть несколько кандидатов.
Вы действительно не хотите давать предупреждение для каждого случая, когда компилятор выбирает между альтернативами. Это даст вам массу предупреждений о таких невинных вещах, как перегрузка и некоторый умный шаблонный код.