web-dev-qa-db-ja.com

テンプレート関数を使用して2つの文字列を交換しようとしています

_#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
_

swap()swap1()はどちらも基本的に同じ関数定義を持っているのに、swap()だけが実際に文字列を交換し、swap1()は交換しないのはなぜですか?

また、デフォルトでstl文字列が引数としてどのように渡されるか、つまり、値または参照によって渡されることを教えてください。

パラメータを値で渡します。あなたはそれらを参照によって渡す必要があります:

template <typename T> void myswap(T& a , T& b);

または-より一般的には-グローバル(rvalue)参照:

template <typename T> void myswap(T&& a , T&& b);
0
Red.Wave