我期待到的boost ::交換的實現:爲什麼將boost :: swap中的swap_impl移動到單獨的命名空間?
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障礙。但我現在沒有心情/沒有時間去進一步解釋 – sehe
@Puppy,boost重新實現它,所以你不需要在swap(a,b)之前使用std :: swap編寫每次您無法通過ADL獲得更有效的實施時,都會回到std :: swap。 –
@AntonFrolov真正的問題是爲什麼'std :: swap'沒有以這種方式實現。 – Lingxi