トップページ > プログラム > 2015年07月17日 > 3GeB3ImX

書き込み順位&時間帯一覧

12 位/175 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000010110011005



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
646
【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net

書き込みレス一覧

【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net
646 :デフォルトの名無しさん[sage]:2015/07/17(金) 14:10:06.77 ID:3GeB3ImX
ムーブとか右辺値についてググって勉強しているのですが、いまいちよく分かりません
std::move(t)は左辺値から右辺値へ変換するための関数だから、当然 t は左辺値であるべきですよね?
tを右辺値にしてる例をよく見るんですが、間違いなんでしょうか?
【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net
650 :646[sage]:2015/07/17(金) 16:14:19.93 ID:3GeB3ImX
http://cpplover.blogspot.jp/2009/11/rvalue-reference_23.html?m=1
たとえば↑のサイトでは、テンプレート関数の引数が左辺値か右辺値かで分ける例があったんですが

template < typename T >
void f( T && t )
{
  if ( std::is_lvalue_reference<T>::value )     X x( t ) ;   else     X x( std::move(t) ) ;
}

このelse側のtは既に右辺値だからstd::moveする必要がないように思います
【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net
652 :646[sage]:2015/07/17(金) 17:28:34.28 ID:3GeB3ImX
std::moveは右辺値型にキャストしてるだけだから、右辺値が引数にきても
右辺値のままで問題ないわけですね
江添氏という大御所のサイトなので深読みしてしまいました
【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net
673 :646[sage]:2015/07/17(金) 20:58:58.51 ID:3GeB3ImX
なんか自分が原因で荒れてしまったようですみません
というか質問スレがあったんですね・・・そちらで聞くべきでしたか

つまり、右辺値は関数の呼び出し側も受け手側も std::move を使うということでしょうか?

struct X {} ;

template < typename T >
void f( T && t )
{
  if ( std::is_lvalue_reference<T>::value )
    X x( t ) ; //・・・@はこっちにくる
  else
    X x( std::move(t) ) ; //・・・Aはこっち
}

int main()
{
  X x ;
  X y ;
  f( x ) ; //・・・@
  f( std::move( y ) ) ; //・・・A
}
【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net
674 :646[sage]:2015/07/17(金) 21:01:32.94 ID:3GeB3ImX
あ、いろいろコード貼っていただいたんですね
ありがとうございます、よく見てみます


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。