#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
Keduanya swap()
dan swap1()
pada dasarnya memiliki definisi fungsi yang sama lalu mengapa hanya swap()
benar-benar menukar string, sementara swap1()
tidak?
Dapatkah Anda memberi tahu saya bahwa bagaimana string stl diberikan sebagai argumen secara default yaitu apakah mereka dilewatkan oleh nilai atau dengan referensi?
c++
templates
pass-by-reference
pass-by-value
stdstring
getBetterprogrammer
sumber
sumber
Jawaban:
Saya bisa melihat mengapa orang-orang tidak menyukai ADL sekarang ...
Apa yang Anda lihat adalah efek dari Argument Dependent Lookup . Jika Anda akan menambahkan cetak di dalam
swap
implementasi Anda, Anda akan melihat bahwa itu tidak dipanggilstd::string
, hanya untukint
.std::swap
lebih disukai daripada versi Anda, karena ada spesialisasi eksplisit untukstd::basic_string
jenis. Jika tidak ada, panggilan mungkin tidak jelas.Sebab
int
, namespacestd
tidak dipertimbangkan dalam proses pencarian, jadi versi Anda adalah satu-satunya yang dapat diterima.Segala sesuatu di C ++ diteruskan oleh nilai, kecuali jika Anda menandainya sebagai pass-by-reference secara eksplisit.
sumber
int
dan satu untukstd::string
), sehingga dua panggilan dicetak. Ada dua panggilanswap
denganstd::string
, dan yang menggunakanstd::swap
(tanpa cetak).Anda melewati parameter berdasarkan nilai. Anda harus melewati mereka dengan referensi:
Atau - lebih umum - dengan referensi global (nilai):
sumber