Я частично согласен с Грегом в том, что неназванные члены пространства имен не более инкапсулированы, чем личные данные. В конце концов, смысл инкапсуляции в том, чтобы скрыть детали реализации от других модулей, а не от других программистов. Тем не менее, я думаю, что в некоторых случаях это полезная техника.
Рассмотрим класс, подобный следующему:
class Foo {
public:
...
private:
static Bar helper;
};
В этом случае любой модуль, который хочет использовать Foo, также должен знать определение Bar, даже если это определение не имеет никакого отношения вообще. Такого рода зависимости заголовков приводят к более частым и длительным перестройкам. Перемещение определения помощника в безымянное пространство имен в Foo.cpp - отличный способ сломать эту зависимость.
Я также категорически не согласен с мнением о том, что безымянные пространства имен как-то менее читабельны или менее понятны, чем статические члены данных. Удаление ненужной информации из вашего заголовка только делает его более кратким.