#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;
}
**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
И то, swap()
и другое в swap1()
основном имеют одинаковые определения функций, то почему только на swap()
самом деле меняются строки, а swap1()
нет?
Также вы можете сказать мне, как stl-строки передаются как аргументы по умолчанию, т.е. передаются ли они по значению или по ссылке?
c++
templates
pass-by-reference
pass-by-value
stdstring
gettingBetterprogrammer
источник
источник
Ответы:
Теперь я понимаю, почему люди осуждают ADL ...
То, что вы видите, является эффектом Argument Dependent Lookup . Если вы хотите добавить шрифт в вашей
swap
реализации, вы заметите , что он не призывалstd::string
, толькоint
.std::swap
предпочтительнее вашей версии, потому что существует явная специализация дляstd::basic_string
типа. Если бы этого не было, то вызов был бы неоднозначным.Ибо
int
пространство именstd
не учитывается в процессе поиска, поэтому ваша версия является единственно приемлемой.Все в C ++ передается по значению, если вы явно не пометите его как передачу по ссылке.
источник
int
и один дляstd::string
), и поэтому два вызова выводятся на печать. Есть два вызоваswap
сstd::string
, и те, которые используютstd::swap
(без печати).Вы передаете параметры по значению. Вам нужно передать их по ссылке:
Или - в более общем смысле - по глобальной (rvalue) ссылке:
источник