Arcen's Blog

アクセスカウンタ

zoom RSS [C++0x]rvalue reference(2)

<<   作成日時 : 2011/03/24 01:23   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

C++0xでの変更により、テンプレートの型推論のルールが変更された。
& & -> &
& && -> &
&& & -> &
&& && -> &&
下の例ではdだけがrvalueとして渡される

template<typename L,typename R>
void function(L&l,R&&r){}

std::string a, b, c, d;
function(a,b);
function(std::move(c),std::move(d));

そのため、rvalueでの移動をできるだけ行いたい場合には、template関数で作製すると、複数引数がある場合に、組み合わせが爆発しない。

std::forwardはrvalue referenceで引数が渡された場合にrvalueとして移動が行えるようにする。
lvalue referenceで渡された場合には、lvalueとなる。

また、std::forwardは単なるキャストのため、複数のメンバに渡す際などには複数回呼べばよい。

#include <string>
class A {
std::string first;
std::wstring second;
public:
A() : first("first"), second(L"second"){}
template<typename T>
A(T&&t)
: first( std::forward<T>(t).first )
, second( std::forward<T>(t).second )
{ printf("%s\n",std::is_lvalue_reference<T>::value ? "コピー" : "ムーブ" ); }
};

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
[C++0x]rvalue reference(2) Arcen's Blog/BIGLOBEウェブリブログ
文字サイズ:       閉じる