为什么 boost::bind 坚持将 `boost::placeholders` 拉入全局命名空间?

use*_*407 11 c++ boost namespaces

以下代码可以轻松修复,但很烦人。

#include <functional>
#include <boost/bind.hpp>
void foo() {
  using namespace std::placeholders;
  std::bind(_1, _2, _3); // ambiguous
}
Run Code Online (Sandbox Code Playgroud)

有一个宏BOOST_BIND_NO_PLACEHOLDERS,但是使用这个宏也会带来一些缺点,比如导致boost::placeholders从包含<boost/bind.hpp>但不包含的编译单元中消失<boost/bind/placeholders.hpp>

该名称冲突还带有其他库一样boost::mpl,我不认为维护者不知道这个问题,但我想知道他们为什么坚持不贬低和删除using namespace boost::placeholders<boost/bind.hpp>

som*_*lse 19

看起来它已经在新版本的 boost 中修复了。

当包含时,boost/bind.hpp我们会收到以下消息:

#pragma message: The practice of declaring the Bind placeholders (_1, _2, ...) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior.

该解决方案在https://www.boost.org/doc/libs/1_73_0/boost/bind.hpp中描述

所以“良好实践”的解决方法是

#include <boost/bind.hpp> 它将 boost::placeholders 放在全局命名空间中

#include <boost/bind/bind.hpp> 它不会将 boost:: 占位符放入全局命名空间中。boost::placeholders::_1然后直接使用限定名称,或者在本地执行using namespace boost::placeholders


And*_*urg 6

您可以使用

#define BOOST_BIND_NO_PLACEHOLDERS
Run Code Online (Sandbox Code Playgroud)

在包含其他 Boost 标头之前。

我不知道这是什么时候引入的,只知道它在 1.67 中有效。随意编辑更准确的信息。