2012年11月2日金曜日

Universal References in C++11

去る 8 月 C++ & Beyond 2012 トレーニングカンファレンスなるものがあり、Scott Meyers、Herb Sutter、Andrei Alexandrescu の C++ 界の3巨頭がレクチャーをしました。僕は実際にカンファレンスに行ったわけではありませんが、今年は会場でのすべてのトークが録画され定期的にアップされているので、誰でも当日のプレゼンを見ることができます。見ていて面白かったのが、Scott Meyers の universal references。この用語は Scott 氏がプレゼンの中で使っているものであり、初期化のされ方次第で lvalue references にも rvalue references にもなりうるというもの。C++11 でサポートされる move semantics を指定するときに使う構文 type&& (move semantics のためだけの構文ではないことがプレゼンを見れば分かります)が、どういうときに universal references となりうるのかについて説明しています。それに伴い、std::move と std::forward の使い分けについても分かりやすく説明しています。

要点は構文上 type&& と書いてあるからといって rvalue references とは限らない、ということです。自分で調べた限り、The C++ Standard Library: A Tutorial and Reference (2nd Edition) では深く触れていなかったと思うので、Scott 氏のこのプレゼンはありがたい。


Effective シリーズで見られた Scott 氏のユーモアもプレゼンの随所に見られとにかく面白いです。そして何よりも Scott 氏のプレゼンのうまさに感激しました。ぜひとも同氏には Effective C++11 を書いていただきたい!というわけでオススメのビデオです。面白いので見てみてください。

追記:Scott 氏自身もブログで改めて解説しています
T&& Doesn’t Always Mean “Rvalue Reference”