我试图学习并采用复制交换习语,遵循对这个问题的全面解释:复制交换习语 https://stackoverflow.com/q/3279543/356440.
但我发现了一些我从未见过的代码:using std::swap; // allow ADL
在这个例子中
class dumb_array
{
public:
// ...
void swap(dumb_array& pOther) // nothrow
{
using std::swap; // allow ADL /* <===== THE LINE I DONT UNDERSTAND */
swap(mSize, pOther.mSize); // with the internal members swapped,
swap(mArray, pOther.mArray); // *this and pOther are effectively swapped
}
};
- 什么是
using std::swap;
意思是函数实现体内?
- ADL 是什么意思?
这种机制通常用在模板化代码中,即template <typename Value> class Foo
.
现在的问题是使用哪个交换。std::swap<Value>
会起作用,但可能并不理想。很有可能有更好的过载swap
对于类型Value
,但是那会在哪个命名空间中呢?几乎可以肯定它不在std::
(因为这是非法的),但很可能在命名空间中Value
。有可能,但还远未确定。
在这种情况下,swap(myValue, anotherValue)
将为您提供“最好的”交换。参数依赖查找将在命名空间中找到任何交换Value
来自。否则using
指令生效,并且std::swap<Value>
将被实例化并使用。
在你的代码中,mSize
可能是一个整数类型,并且mArray
一个指针。两者都没有关联的命名空间,并且std::swap
无论如何,99.9% 的确定性对他们来说是最佳的。因此,using std::swap;
声明在这里似乎毫无用处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)