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:

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

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

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

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

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.