#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
Zarówno swap()
i swap1()
zasadniczo mają te same definicje funkcji, to dlaczego swap()
właściwie tylko zamienia ciągi, a swap1()
nie ma?
Czy możesz mi również powiedzieć, że w jaki sposób łańcuchy stl są domyślnie przekazywane jako argumenty, tj. Czy są przekazywane przez wartość czy przez odwołanie?
c++
templates
pass-by-reference
pass-by-value
stdstring
gettingBetterprogrammer
źródło
źródło
Odpowiedzi:
Rozumiem, dlaczego ludzie marszczą teraz ADL ...
To, co widzisz, jest efektem wyszukiwania zależnego od argumentu . Jeśli dodasz wydruk w swojej
swap
implementacji, zauważysz, że nie jest on wymaganystd::string
, tylko dlaint
.std::swap
jest preferowane w stosunku do twojej wersji, ponieważ istnieje wyraźna specjalizacja dlastd::basic_string
typu. Gdyby nie istniał, połączenie byłoby prawdopodobnie dwuznaczne.Ponieważ
int
przestrzeń nazwstd
nie jest uwzględniana w procesie wyszukiwania, więc Twoja wersja jest jedyną akceptowalną.Wszystko w C ++ jest przekazywane przez wartość, chyba że wyraźnie oznaczysz je jako referencję.
źródło
int
i jedno dlastd::string
), więc dwa połączenia są drukowane. Istnieją dwa połączeniaswap
zstd::string
i te używająstd::swap
(bez drukowania).Przekazujesz parametry według wartości. Musisz przekazać je przez odniesienie:
Lub - bardziej ogólnie - według globalnego (rvalue) odniesienia:
źródło