#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
Les deux swap()
etswap1()
fondamentalement ont les mêmes définitions de fonctions, alors pourquoi n'échange swap()
que les chaînes, alors swap1()
que non?
Pouvez-vous également me dire comment les chaînes stl sont passées comme arguments par défaut, c'est-à-dire si elles sont passées par valeur ou par référence?
c++
templates
pass-by-reference
pass-by-value
stdstring
gettingBetterprogrammer
la source
la source
Réponses:
Je peux voir pourquoi les gens froncent les sourcils sur ADL maintenant ...
Ce que vous voyez est un effet de la recherche dépendante de l' argument . Si vous ajoutiez une impression à l'intérieur de votre
swap
implémentation, vous remarqueriez qu'elle n'est pas appeléestd::string
, seulement pourint
.std::swap
est préférable à votre version, car il existe une spécialisation explicite pour lestd::basic_string
type. S'il n'existait pas, l'appel serait probablement ambigu.Pour
int
, l'espace de nomsstd
n'est pas pris en compte dans le processus de recherche, votre version est donc la seule acceptable.Tout en C ++ est passé par valeur, sauf si vous le marquez explicitement comme passe-par-référence.
la source
int
et un pourstd::string
), et donc deux appels sont imprimés. Il y a deux appels àswap
withstd::string
, et ceux-ci utilisentstd::swap
(pas d'impression).Vous passez des paramètres par valeur. Vous devez les transmettre par référence:
Ou - plus généralement - par référence globale (rvalue):
la source