このブログでは、まだ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