C++0x Support in Visual Studio 2010(pdf)
なかなか面白い。
VC10には、Lambda, auto, decltype, static_assert, Rvalue Referenceが入る。
autoやdecltypeについては、今さら解説するまでもないが、Including multi-declarator autoとあるのは、以下のようなコードのことを言うのだろう。
auto a = 0, b = 0.1, c = func() ;
lambdaに関しては、mutableなlambdaも入るという。これはだいぶ最近になってドラフトに加えられた仕様で、どういうものかというと、lambdaのoperator ()とはconstになっているので、通常、キャプチャした変数を書き換えることができない。mutableを使うと、これができるようになる。やるべきではないと思うけれど。
template < std::ForwardIterator Iter >
void f( Iter first, Iter last )
{
iter::value_type sum = 0;
//mutableがなければ、ここでエラーになる。
std::for_each(first, last, [=] (Iter value) mutable
{ sum += value ; std::cout << sum << std::endl ; } ) ;
//この時点で、sumは0である。なぜなら、lambda関数のキャプチャしたsumは、コピーだから。
}
lambda関数内のsumはコピーだから、このコードは無意味じゃないかというツッコミは、上記のコードの本題ではない。重要なことは、sumはラムダ関数のオブジェクトが消滅するまで生きていて、値を保持でき、しかも書き換えられるということだ。追記:せっかくだから、lambda関数内のsumを使うようにしてみた。
static_assertとは、BOOSTにあるBOOST_STATIC_ASSERTマクロと同じものである。これは本来、コンパイラ側でサポートしたほうが、何かと都合がいい。
はて、Rvalue Referenceの"NOT including *this"、とはどういう意味だろう。メンバ関数から*thisをrvalue referenceで返すのが不可ということなのだろうか。
また、Dinkumwareのconversionライブラリや、カスタムアロケータライブラリも入るらしい。Dinkumwareのconversionライブラリが入るということは、utf8-utf16間の相互変換ができるということだ。カスタムアロケータは色々あるが、まあ、まず使うことはないだろう。
ところで、ボーナススライドに、nullary Lambdaというものがある。これは、ひょっとすると、ドラフトの私の解釈が正しかったということではないか。つまり、lambda関数の引数がないときは、()自体を省略できるというものだ。
追記:正直な感想を言おう。このPDF、どう考えても背景画像が邪魔である。文字が読みにくい事この上ない。
> Rvalue Referenceの"NOT including *this"
ReplyDeleteたぶんこれです。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm
ああ、なるほど。
ReplyDeleteメンバ関数の暗黙の引数である*thisが、lvalue referenceかrvalue referenceのどちらであるかを指定できる機能ですか
これは重要だ。サポートしていないとは残念。
ところでこれ、メンバ関数をlvalue refかrvalue refでオーバーロードする時は、
どちらもref-qualifierで明示的に指定しないとエラーなんですかね。
何も指定しなければ、暗黙のうちにlvalue refを指定したことになるのだけれど。
n2800の13.1.2 段落3によると、エラーっぽいですね。
ReplyDelete名前とparamter-type-listが同じ関数は、全てにref-qualifierがついているか、もしくはついていないかのどちらかでないといかんようです