В Boost 1.55, current_function.hpp
читает что-то вроде этого:
namespace boost
{
namespace detail
{
inline void current_function_helper()
{
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__)
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
#elif ...
#endif
}
} // namespace detail
} // namespace boost
Почему автор даже удосужился написать эти пространства имен?
detail
Пространства имен помогают избежать загрязнения официальных изнутри внутренними функциями или классами, о которых пользователь не должен знать.
Современные IDE анализируют файлы заголовков и предоставляют завершение кода, то есть предложения по именам, если вы начинаете писать что-то вроде boost::c
, Это было бы совершенно неприменимо, если бы внутренние алгоритмы, такие как, например, copy_pod_nontrivial
также будет в списке.
Кроме того, опечатка может привести к вызову внутренней функции или объявлению объекта типа внутреннего класса. Это определенно не то, что мы хотим.
Более технической причиной этого является ADL: некоторые функции находятся по типу их аргументов (аргументы шаблона для шаблонов функции также задействованы); Это может привести к поиску имен для поиска имен в официальном пространстве имен. Если в нем объявлены вспомогательные функции (или классы), это может вызвать проблемы с разрешением перегрузки.
Пользователи никогда не должны (должны) использовать эти внутренние функции, поэтому, если вы видите код пользователя, который обращается к detail
Как пространство имен вы должны быть начеку