2013年12月29日日曜日

C++11のlvalueとrvalueで引っかかるところ

lvalueとrvalueについて、僕が引っかかったところをメモしておく。

とりあえずひと通りは江添氏の本の虫で読めば分かる。

本の虫

ここから先は本の虫の記事を読んでもイマイチ腑に落ちない人向けである。以下の様なコードを考える。


#include <iostream>

void f(int&& i){
    std::cout << "rvalue" << std::endl;
}

void f(int& i){
    std::cout << "lvalue" << std::endl;
}

void g(int&& i){
    f(i);
}

int main(){
    int i = 0;
    g(std::move(i));
}

さて、ここで出力はどうなるだろうか? Wandboxで確かめてみよう。

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

出力が「lvalue」であることが確認できただろうか。

なぜか?

関数gの仮引数iがlvalueだからである。

言い換えると、iはrvalueリファレンス型のlvalueだからである。

つまり、「rvalueリファレンス型のインスタンスである」ということと、「rvalueである」こと、すなわち「rvalueリファレンスでキャプチャされる」ということは本質的に無関係である。

C++におけるvalueカテゴリと型システムはまったく無関係なのだ。

0 件のコメント:

コメントを投稿