Это предназначено.Поиск имени останавливается в области, где имя найдено.Механизм гарантирует, что ваш код ведет себя одинаково, даже если функции добавляются или удаляются из окружающих областей.
В противном случае изменение членов N
может привести к нарушению вложенных классов и пространств имен.Рассмотрим возможные катастрофы, если добавить свободную функцию, которая лучше соответствует разрешению перегрузки по сравнению с другим членом класса.Если его не игнорировать, поведение класса может случайно измениться !
Этот пример должен проиллюстрировать проблему:
namespace ns {
// void foo(int) { std::terminate(); }
struct C {
void foo(char) {}
C() {
foo(0);
}
};
}
В соответствии с текущими правилами,uncommenting foo
не будет иметь побочных эффектов.Но если поиск по имени действительно учитывает это, поскольку 0 является int
и должно быть преобразовано в char
, создание C
приведет к прерыванию программы!Это резко и легко обнаружить.Но в реальной программе 100M LOC неправильный поиск имени может привести к ошибкам, которые будут гораздо более зловещими и более сложными.