#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
Ambos swap()
e swap1()
basicamente têm as mesmas definições de funções, por que apenas swap()
trocam as strings, enquanto swap1()
não?
Além disso, você pode me dizer que como as strings stl são passadas como argumentos por padrão, ou seja, são passadas por valor ou por referência?
c++
templates
pass-by-reference
pass-by-value
stdstring
gettingBetterprogrammer
fonte
fonte
Respostas:
Eu posso ver por que as pessoas estão desaprovando a ADL agora ...
O que você vê é um efeito da pesquisa dependente de argumento . Se você adicionar uma impressão em sua
swap
implementação, perceberá que ela não é solicitadastd::string
, apenas paraint
.std::swap
é preferível à sua versão, porque existe uma especialização explícita para ostd::basic_string
tipo. Se não existisse, a ligação seria ambígua provavelmente.Pois
int
, o espaço para nomestd
não é considerado no processo de pesquisa; portanto, sua versão é a única aceitável.Tudo em C ++ é passado por valor, a menos que você o marque como referência explicitamente.
fonte
int
e uma parastd::string
) e, portanto, duas chamadas são impressas. Existem duas chamadas paraswap
comstd::string
e essas são usadasstd::swap
(sem impressão).Você está passando parâmetros por valor. Você precisa passá-los por referência:
Ou - mais geralmente - por referência global (rvalue):
fonte