- 【初心者歓迎】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 - あ、いろいろコード貼っていただいたんですね
ありがとうございます、よく見てみます
|