2009-05-19

VC10について興味深いことをいくつか

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、どう考えても背景画像が邪魔である。文字が読みにくい事この上ない。

3 comments:

アキラ said...

> Rvalue Referenceの"NOT including *this"
たぶんこれです。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm

江添亮 said...

ああ、なるほど。
メンバ関数の暗黙の引数である*thisが、lvalue referenceかrvalue referenceのどちらであるかを指定できる機能ですか
これは重要だ。サポートしていないとは残念。

ところでこれ、メンバ関数をlvalue refかrvalue refでオーバーロードする時は、
どちらもref-qualifierで明示的に指定しないとエラーなんですかね。
何も指定しなければ、暗黙のうちにlvalue refを指定したことになるのだけれど。

DigitalGhost said...

n2800の13.1.2 段落3によると、エラーっぽいですね。
名前とparamter-type-listが同じ関数は、全てにref-qualifierがついているか、もしくはついていないかのどちらかでないといかんようです