トップページ > プログラム > 2015年07月18日 > +Rsx7s6r

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

36 位/212 ID中時間01234567891011121314151617181920212223Total
書き込み数0110000000000000000000002



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

書き込みレス一覧

【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net
711 :646[sage]:2015/07/18(土) 01:48:45.91 ID:+Rsx7s6r
議論がかなりヒートアップしてて書き込むのが恐れ多いのですが・・・

どうやら左辺値・右辺値および左辺値参照・右辺値参照というものを正しく理解していないのが
自分の混乱の原因みたいです。
そこで確認させていただきたいのですが、以下の lr と rr はどちらもlvalueなんでしょうか?

struct X{ } ;
int f() { return 0 ; }

int main()
{
  int i = 0 ; // 式じゃないので、i はrvalueでもlvalueでもない
  i ;   // lvalue
  0 ;  // rvalue
  X x ; // 式じゃないので、x はrvalueでもlvalueでもない
  x ;   // lvalue
  X() ;  // rvalue
  f() ;  // rvalue
  X & lr = x ;    // lr はlvalueへの参照だが、lr 自体はlvalue?
  X && rr = X() ; // rr はrvalueへの参照だが、rr 自体はlvalue?
}

# そういえば、右辺値やムーブ等を勉強するために相当ググって色々なサイトを見ましたが
皆微妙に言っていることが違ったりして、このスレで激論が生じるのもむべなるかなと感じた次第・・・
まぁそこがC++の面白さでもあるんですかね
【初心者歓迎】C/C++室 Ver.96【環境依存OK】 [転載禁止]©2ch.net
713 :646[sage]:2015/07/18(土) 02:05:32.81 ID:+Rsx7s6r
>>712
ありがとうございます。やはりそうですか

ということは、>>673の例に戻ると、以下の理屈で正しいということでしょうか?

struct X {} ;

template < typename T >
void f( T && t ) // この t は「右辺値参照の左辺値」なので、std::move(t) で「右辺値参照の右辺値」に変換してやる必要がある
{
  if ( std::is_lvalue_reference<T>::value )
    X x( t ) ;
  else
    X x( std::move(t) ) ;
}

int main()
{
  X x ;
  X y ;
  f( x ) ;
  f( std::move( y ) ) ; // ここで y は右辺値に変換はされるが・・・
}


つまり、関数の仮引数は、右辺値参照だろうがなんだろうが、必然的に常に左辺値になってしまうということでしょうか


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