Это определяется стандартом (такие вещи всегда есть). Главное, что нужно понять, это то, что различные строки using namespace
не влияют на вашу программу.
using namespace Foo
- это «директива using», которая влияет на поиск имени, который выполняется кодом в области видимости. То есть, если какая-то более поздняя функция в вашем блоке namespace C {}
попытается найти какой-либо объект с именами foo
, A
и B
, он окажется в числе мест, где компилятор будет искать, чтобы найти foo
. Напротив, это не изменило бы, где компилятор будет выглядеть, если бы более поздний код ссылался на C::foo
. Порядок двух последовательных using namespace
с в одном блоке не имеет значения, поскольку каждый из них имеет полный эффект до конца блока.
Причина, по которой вы можете найти f
в C
или D
, заключается в "объявлении об использовании" using A::f
. Объявление-использование, в отличие от директивы-использования, приводит к тому, что имя вводится в область видимости, так что другой код может ссылаться на имя как находящееся внутри этой области.