1

に関して。提案された重複「値渡しはC++ 11の妥当なデフォルトですか?」-そこの質問答えも、「ユニバーサル参照」コンストラクターのバージョンについて言及していないため、重複を実際に確認できません。再開を検討します。


私は移動のセマンティックに慣れ、それを試しています。この(コンパイル可能な)コードを見てください:

#include <iostream>
#include <string>

struct my_str {
  std::string s;

  my_str(const std::string & str): s(str) { std::cout << "  my_str parameter ctor" << std::endl; }
  my_str(const my_str & o): s(o.s)        { std::cout << "  my_str copy ctor" << std::endl; }
  my_str(my_str && o): s(std::move(o.s))  { std::cout << "  my_str move ctor" << std::endl; }
};

template <typename T>
my_str build_ur(T && s) {
  return my_str(std::forward<T>(s));
}

my_str build_val(my_str s) {
  return my_str(std::move(s)); 
}

int main() {
  my_str s1("hello");
  my_str s2("world");

  std::cout << "Building from universal reference (copy):" << std::endl;
  build_ur(s1);
  std::cout << "Building from universal reference (move):" << std::endl;
  build_ur(std::move(s1));

  std::cout << "Building from value (copy):" << std::endl;
  build_val(s2);               
  std::cout << "Building from value (move):" << std::endl;
  build_val(std::move(s2));    

  std::cout << std::endl;
  return 0;
}

出力:

g++-4.8 -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
  my_str parameter ctor
  my_str parameter ctor
Building from universal reference (copy):
  my_str copy ctor
Building from universal reference (move):
  my_str move ctor
Building from value (copy):
  my_str copy ctor
  my_str move ctor
Building from value (move):
  my_str move ctor
  my_str move ctor

http://coliru.stacked-crooked.com/a/3be77626b7ca6f2c

どちらの関数も、どちらの場合でも適切に機能します。値渡し関数は移動コンストラクターをもう一度呼び出しますが、これは安価なはずです。あるパターンが他のパターンよりも優先されるべき状況についてコメントしていただけますか?

4

1 に答える 1