什么是复制和交换成语? 在这个问题中,在顶部的答案中,在实现交换公共朋友过载的部分内,实现利用了这个:
friend void swap(dumb_array& first, dumb_array& second){
//the line of code below
using std::swap;
//then it calls the std::swap function on data members of the dumb_array`s
}
我的问题如下:这里使用的使用std::swap
用于什么(答案提到了与启用ADL相关的内容); 这里具体调用的是“using”的什么用例,添加那一行代码和不添加它对代码的影响是什么?
using语句使此行起作用:
swap(first, second);
注意,我们可以省略swap
前面的std::
。
重要的是std::swap(。。。)
是限定查找,而swap(。。。)
是非限定查找。 主要区别在于,限定查找是在特定的命名空间或作用域(指定的那个)中调用函数,而非限定查找更灵活一点,因为它将查找当前上下文的父作用域以及全局命名空间。 此外,非限定查找还将查找参数类型的范围。 这是一个很好的工具,但也很危险,因为它可以从意想不到的地方调用函数。
ADL只能使用非限定查找,因为它必须搜索其他名称空间和作用域。
使用std::swap的还确保如果没有通过ADL找到函数,它将在默认情况下调用
std::swap
。
这个习惯用法允许用户定义交换函数:
struct MyType {
// Function found only through ADL
friend void swap(MyType& l, MyType& r) {
// ...
}
};