#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
Beide swap()
und swap1()
haben im Grunde die gleichen Funktionsdefinitionen. Warum werden dann nur swap()
die Zeichenfolgen ausgetauscht, während swap1()
dies nicht der Fall ist?
Können Sie mir auch sagen, wie STL-Zeichenfolgen standardmäßig als Argumente übergeben werden, dh ob sie als Wert oder als Referenz übergeben werden?
c++
templates
pass-by-reference
pass-by-value
stdstring
GettingBetterprogrammer
quelle
quelle
Antworten:
Ich kann sehen, warum die Leute ADL jetzt missbilligen ...
Was Sie sehen, ist ein Effekt der argumentabhängigen Suche . Wenn Sie einen Druck innerhalb Ihrer hinzufügen würden
swap
Implementierung, würden Sie feststellen , dass es nicht für genanntstd::string
, nur fürint
.std::swap
wird Ihrer Version vorgezogen, da es eine explizite Spezialisierung für denstd::basic_string
Typ gibt. Wenn es nicht existiert, wäre der Anruf wahrscheinlich mehrdeutig.Für
int
, Namespacestd
ist nicht im Suchprozess in Betracht gezogen, so dass Ihre Version die nur akzeptabel ist.Alles in C ++ wird als Wert übergeben, es sei denn, Sie markieren es explizit als Referenzübergabe.
quelle
int
und einen fürstd::string
), sodass zwei Aufrufe gedruckt werden. Es gibt zwei Anrufeswap
mitstd::string
und diese verwendenstd::swap
(kein Druck).Sie übergeben Parameter nach Wert. Sie müssen sie als Referenz übergeben:
Oder - allgemeiner - durch globale (rWert-) Referenz:
quelle