Boost.Bindのプレースホルダー

Boost.Bindのプレースホルダーは以下のように名前空間を指定することなく使えるので、ADLで探索されると考えてる方はけっこう多いようです。

boost::bind(f, _1);


でも実は、単に無名名前空間に定義されています。

// boost/bind/placeholders.hpp
namespace
{

boost::arg<1> _1;
boost::arg<2> _2;
boost::arg<3> _3;
boost::arg<4> _4;
boost::arg<5> _5;
boost::arg<6> _6;
boost::arg<7> _7;
boost::arg<8> _8;
boost::arg<9> _9;

} // unnamed namespace

これがBoost内で問題視されていたこともあって、LambdaやPhoenix、C++11標準などのプレースホルダーは名前のついた名前空間内で定義されているようです。