提问者:小点点

函数内的C++using语句,后跟函数名(对于ADL?)


什么是复制和交换成语? 在这个问题中,在顶部的答案中,在实现交换公共朋友过载的部分内,实现利用了这个:

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”的什么用例,添加那一行代码和不添加它对代码的影响是什么?


共1个答案

匿名用户

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) {
        // ...
    }
};

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(函数|c++using|语句|后跟|函|数名|adl)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?