【问题标题】:why move swap_impl in boost::swap to a separate namespace?为什么将 boost::swap 中的 swap_impl 移动到单独的命名空间?
【发布时间】:2015-05-04 13:04:11
【问题描述】:

我正在研究 boost::swap 的实现:

namespace boost_swap_impl
{
  template<class T>
  BOOST_GPU_ENABLED
  void swap_impl(T& left, T& right)
  {
    using namespace std;//use std::swap if argument dependent lookup fails
    swap(left,right);
  }

  template<class T, std::size_t N>
  BOOST_GPU_ENABLED
  void swap_impl(T (& left)[N], T (& right)[N])
  {
    for (std::size_t i = 0; i < N; ++i)
    {
      ::boost_swap_impl::swap_impl(left[i], right[i]);
    }
  }
}

namespace boost
{
  template<class T1, class T2>
  BOOST_GPU_ENABLED
  void swap(T1& left, T2& right)
  {
    ::boost_swap_impl::swap_impl(left, right);
  }
}

该实现还包含以下注释:

// Note: the implementation of this utility contains various workarounds:
// - swap_impl is put outside the boost namespace, to avoid infinite
// recursion (causing stack overflow) when swapping objects of a primitive
// type.

但是,我不明白为什么原始类型(以及为什么只有原始类型)会导致无限递归。

【问题讨论】:

  • 命名空间很可能是 ADL 屏障。但我现在没心情/没时间进一步解释
  • @Puppy,boost 重新实现了它,因此您无需在每次未能获得更有效的情况下使用 std::swap 之前使用 swap(a,b) 回退到 std::swap通过 ADL 实现。
  • @AntonFrolov 真正的问题是为什么std::swap 没有以这种方式实现。

标签: c++ boost argument-dependent-lookup


【解决方案1】:

如果swap_impl 在命名空间boost 中,则swap_impl 实现中的调用swap(left,right); 将解析为boost::swap 而不是std::swap。即boost::swap -&gt; boost::swap_impl -&gt; boost::swap,因此无限递归。

正如 dyp 在评论中指出的那样,对评论 //use std::swap if argument dependent lookup fails 的正确解释应该如下:一个不合格的 swap(left,right) 旨在为两个参数选择一个专门的交换函数,在这些论点的类型。如果没有提供这样的专用函数,则使用通用的std::swap 作为后备。

【讨论】:

  • 这是我最初的想法,但是,有两件事让我感到困惑:1)为什么无限递归只发生在原始类型上; 2) 为什么它解析为 boost::swap?编译器应该在 ::std 和 ::boost 中看到交换实现,并由于不明确的调用而发出错误。
  • 1) 我猜作者实际上是在试图表示没有重载std::swap 的类型。原始类型就是其中之一。 2) 这受函数调用解析规则的约束。我不熟悉规则的细节,因此无法给你一个确切的答案。对不起。
  • stackoverflow.com/questions/30032332/…。这个问题应该对我们俩都有帮助:-)
  • @dyp 刚刚被您的评论所启发。对评论的这种解释应该是准确的。
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2011-08-30
  • 1970-01-01
  • 2011-01-24
  • 2017-05-05
相关资源
最近更新 更多