2013-05-23

このブログの数年前のC++0x記事を参考にすべからず

このブログでは、まだC++11がC++0xと呼ばれていたドラフト段階から、C++11を解説してきた。

当時の記事は当時のドラフトに基づいて書かれているため、正式なC++11の仕様ではない。そのため、2011年以前のC++0x記事を参考にならないし、当然参考にしてはいけない。

例えば以下の記事は、2009年当時のドラフトの解釈である。

本の虫: lambdaのちょっと分からない点

正式なC++11規格では、immediate enclosing scopeではなく、lambda式を含む関数の最も外側のブロックスコープをreaching scopeと定義し、たとえlambda式がネストされていた場合でも通過できるようにした。これにより、lambda式をネストしても識別子はreaching scopeからlookupされるので、使うことができる。ただし、外側のlambda式でキャプチャーしたものでなければ、内側のlambda式では使えない。

void f()
{
    int x ;

    // OK
    // 2009年当時のドラフトではエラー
    [=] { [=]{ x ; } ; } ;

    // エラー、外側のlambda式がxをキャプチャーしていない
    [] { [=]{ x ; } ; } ;

}

No comments: