// Assuming the following:
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
// or even using namespace std, though this
// would make std::swap a candidate even
// without ADL
// renaming shows that it's not this function
// that gets called ...
void myswap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
// printing some output also reveals what's going on
}
int main() {
string a{"sssss"}, b{"ddddd"};
swap(a,b); // this is not calling your swap!
// myswap(a,b) produces the error you expected
cout << a << ' '<< b <<endl;
return 0;
}
它没有调用你的交换功能。命名空间是一种接口,所以当声明自由函数与它们操作的数据类型在同一个命名空间中时,然后调用它们时没有适当的名称空间限定。
这被称为“参数相关名称查找”或ADL。
因此,当您在std::string
上调用函数swap
时,它还会在std
名称空间中查找候选项。并且由于std::swap
可以应用于字符串,并且不会在您的全局名称空间中使用其他候选项(因为您的交换只能对整数进行操作),它将用于该调用。
正如我上面显示你可以让你的函数产生的调试输出或重新命名它很容易验证它不是你的函数被调用。
作为一个方面说明:假设有某种从字符串到int的隐式转换。你会得到两个临时工。然后你的交换函数会被调用(实际上不是,因为binding non const references to temporaries isn't allowed)和这些整数交换。接着?这对原始字符串没有任何影响。
最后,我不会将此代码计算为便携式。它只在头部字符串或iostream包含算法头部时编译,而这三者之一为字符串提供了std :: swap的特化。但是由于这个标准似乎没有保证,所以这个代码只有在你自己包含算法时才能可靠地工作。
为了验证你的程序确实按照你的想法做了什么,使你的'swap'函数打印一条消息。 –
要改善您的问题,请发布提供问题的实际代码。你显然省略了一些线,也许认为它们不重要。 –
感谢您的反馈意见。这真的很有帮助。我没有预料到内置的交换功能会被调用。我按照@n.m的建议打印了一条消息。这证明我的交换没有被调用。我曾经使用过“使用命名空间标准”,这是这里的罪魁祸首。非常感谢!下次将包含完整的代码。对不起, –