#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()
y swap1()
básicamente tienen las mismas definiciones de funciones, ¿por qué solo swap()
intercambia las cadenas, mientras swap1()
que no?
Además, ¿puede decirme cómo se pasan las cadenas stl como argumentos de forma predeterminada, es decir, si se pasan por valor o por referencia?
c++
templates
pass-by-reference
pass-by-value
stdstring
GettingBetterprogrammer
fuente
fuente
Respuestas:
Puedo ver por qué las personas desaprueban a ADL ahora ...
Lo que ves es un efecto de la búsqueda dependiente de argumentos . Si desea añadir una impresión dentro de su
swap
aplicación, se daría cuenta de que está no pidióstd::string
, sólo paraint
.std::swap
es preferible a su versión, porque existe una especialización explícita para elstd::basic_string
tipo. Si no existiera, la llamada probablemente sería ambigua.Para
int
, el espacio de nombresstd
no se considera en el proceso de búsqueda, por lo que su versión es la única aceptable.Todo en C ++ se pasa por valor, a menos que lo marque como paso por referencia explícitamente.
fuente
int
y otra parastd::string
), por lo que se imprimen dos llamadas. Hay dos llamadas aswap
withstd::string
, y aquellas que se usanstd::swap
(sin impresión).Estás pasando parámetros por valor. Debe pasarlos por referencia:
O, más generalmente, por referencia global (valor):
fuente