get*_*mer 9 c++ templates pass-by-reference pass-by-value stdstring
#include<iostream>
#include<string>
template <typename T>
void swap(T a , T b)
{
T temp = a;
a = b;
b = temp;
}
template <typename T1>
void swap1(T1 a , T1 b)
{
T1 temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10 , b = 20;
std::string first = "hi" , last = "Bye";
swap(a,b);
swap(first, last);
std::cout<<"a = "<<a<<" b = "<<b<<std::endl;
std::cout<<"first = "<<first<<" last = "<<last<<std::endl;
int c = 50 , d = 100;
std::string name = "abc" , surname = "def";
swap1(c,d);
swap1(name,surname);
std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;
swap(c,d);
swap(name,surname);
std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
**Output**
a = 10 b = 20
first = Bye last = hi
c = 50 d = 100
name = abc surname = def
c = 50 d = 100
name = def surname = abc
Run Code Online (Sandbox Code Playgroud)
两者swap()和swap1()基本上具有相同的函数定义那么为什么只swap()实际交换字符串,而swap1()没有呢?
你也能告诉我 stl 字符串是如何默认作为参数传递的,即它们是按值传递还是按引用传递?
我明白为什么人们现在对 ADL 不屑一顾了……
您看到的是Argument Dependent Lookup的效果。如果你在你的swap实现中添加一个打印,你会注意到它没有被调用std::string,只为int。
std::swap优于你的版本,因为存在一个明确的专业化的std::basic_string类型。如果它不存在,调用可能会模棱两可。
对于int,std在查找过程中不考虑命名空间,因此您的版本是唯一可接受的。
你也能告诉我 stl 字符串是如何默认作为参数传递的,即它们是按值传递还是按引用传递?
C++ 中的所有内容都是按值传递的,除非您明确将其标记为按引用传递。