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:

Post a Comment

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.