函数内的 c++ using 语句,后跟函数名称(用于 ADL?)
The c++ using statement within a function, followed by a function name (for ADL?)
What is the copy-and-swap idiom?
在这个问题中,在最上面的答案中,在实现 swap public friend 重载的部分中,实现使用了这个:
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
}
我的问题是:这里的using std::swap
是干什么用的(答案提到了与启用ADL相关的东西);这里具体调用了“using”的什么用例,添加该行代码的效果是什么,不在代码中添加它的效果是什么?
using 语句使这一行有效:
swap(first, second);
注意我们可以省略swap
前面的std::
。
重要的是 std::swap(...)
是 合格查找 ,但 swap(...)
是 不合格查找 .主要区别在于限定查找是在特定名称空间或范围(指定的范围)中调用函数,而非限定查找更灵活一些,因为它将查找当前上下文的父范围以及全局名称空间。此外,非限定查找还将查看参数类型的范围。这是一个很好的工具,但也很危险,因为它可以从意想不到的地方调用函数。
ADL 仅适用于非限定查找,因为它必须搜索其他名称空间和范围。
using std::swap
也保证如果通过ADL没有找到函数,会默认调用std::swap
这个习惯用法允许用户定义交换函数:
struct MyType {
// Function found only through ADL
friend void swap(MyType& l, MyType& r) {
// ...
}
};
What is the copy-and-swap idiom? 在这个问题中,在最上面的答案中,在实现 swap public friend 重载的部分中,实现使用了这个:
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
}
我的问题是:这里的using std::swap
是干什么用的(答案提到了与启用ADL相关的东西);这里具体调用了“using”的什么用例,添加该行代码的效果是什么,不在代码中添加它的效果是什么?
using 语句使这一行有效:
swap(first, second);
注意我们可以省略swap
前面的std::
。
重要的是 std::swap(...)
是 合格查找 ,但 swap(...)
是 不合格查找 .主要区别在于限定查找是在特定名称空间或范围(指定的范围)中调用函数,而非限定查找更灵活一些,因为它将查找当前上下文的父范围以及全局名称空间。此外,非限定查找还将查看参数类型的范围。这是一个很好的工具,但也很危险,因为它可以从意想不到的地方调用函数。
ADL 仅适用于非限定查找,因为它必须搜索其他名称空间和范围。
using std::swap
也保证如果通过ADL没有找到函数,会默认调用std::swap
这个习惯用法允许用户定义交换函数:
struct MyType {
// Function found only through ADL
friend void swap(MyType& l, MyType& r) {
// ...
}
};