为什么boost :: bind坚持将`boost :: placeholders`放到全局名称空间中?

时间:2018-11-08 08:32:15

标签: c++ boost namespaces

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

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

有一个宏BOOST_BIND_NO_PLACEHOLDERS,但是使用此宏也会带来一些弊端,例如导致boost::placeholders从包含在<boost/bind.hpp>但不包含在<boost/bind/placeholders.hpp>的编译单元中消失。

名称冲突也与其他库(例如boost::mpl)一起出现,我不认为维护人员不知道问题所在,但我想知道为什么他们坚持不弃用和删除using namespace boost::placeholders<boost/bind.hpp>中。

2 个答案:

答案 0 :(得分:2)

看起来它已在较新版本的 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

答案 1 :(得分:0)

您可以使用

#define BOOST_BIND_NO_PLACEHOLDERS

在包含其他Boost头之前。

我不知道什么时候引入它,只是它在1.67中起作用。随时进行编辑,获得更准确的信息。