【发布时间】: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