このブログでは、まだC++11がC++0xと呼ばれていたドラフト段階から、C++11を解説してきた。
当時の記事は当時のドラフトに基づいて書かれているため、正式なC++11の仕様ではない。そのため、2011年以前のC++0x記事を参考にならないし、当然参考にしてはいけない。
例えば以下の記事は、2009年当時のドラフトの解釈である。
正式な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.