From 8cd61c6a88835035eb4f66e9e6281a83937e601d Mon Sep 17 00:00:00 2001 From: yumetodo Date: Wed, 11 Jan 2023 00:44:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20P0588R1=E3=81=A7=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=9Fodr-usable=E3=81=AB=E3=81=A4?= =?UTF-8?q?=E3=81=84=E3=81=A6=E8=A8=98=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref: - https://timsong-cpp.github.io/cppwp/n4861/basic.def.odr#9 - https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0588r1.html --- .../simplifying_implicit_lambda_capture.md | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lang/cpp20/simplifying_implicit_lambda_capture.md b/lang/cpp20/simplifying_implicit_lambda_capture.md index 573ab11e03..b8cbbf1d8e 100644 --- a/lang/cpp20/simplifying_implicit_lambda_capture.md +++ b/lang/cpp20/simplifying_implicit_lambda_capture.md @@ -21,12 +21,31 @@ void f() { } ``` -構造化束縛で導入された名前はラムダ式でキャプチャできない、と明記された。しかしその後、「[構造化束縛を拡張して通常の変数宣言のように使用できるようにする](extending_structured_bindings_to_be_more_like_variable_declarations.md)」の仕様でそれが可能となったため、この仕様変更は打ち消された。 +本提案では一旦、構造化束縛で導入された名前はラムダ式でキャプチャできない、と明記された。その後、「[構造化束縛を拡張して通常の変数宣言のように使用できるようにする](extending_structured_bindings_to_be_more_like_variable_declarations.md)」の仕様でそれが可能となったため、この部分は打ち消された。 +## 仕様 + +odr-usable(=ある名前の定義がその場所で見つかるか)という用語を導入して、lamda式でキャプチャできるものの増加に対して、規格文面の整理が行われた。 + +ローカル変数のように、ローカルでodr-usedされる時に、その場所ではodr-usableでないとき、そのプログラムは適格ではない。 + +```cpp +void f(int n) { + [] { n = 1; }; // error: nが使われようとしているのはlambda式の中なので、odr-usableではない + struct A { + void f() { n = 2; } // error: nが使われようとしているのは関数定義スコープの中なので、odr-usableではない + }; + void g(int = n); // error: nが使われ用としているのはlambda式以外の関数引数スコープの中なので、odr-usableではない + [=](int k = n) {}; // error: n is not odr-usable due to being + // outside the block scope of the lambda-expression + [&] { [n]{ return n; }; }; // OK +} +``` ## 関連項目 - [C++17 構造化束縛](/lang/cpp17/structured_bindings.md) - [C++20 構造化束縛を拡張して通常の変数宣言のように使用できるようにする](extending_structured_bindings_to_be_more_like_variable_declarations.md) +- [C++20 構造化束縛した変数の参照キャプチャを許可](reference_capture_of_structured_bindings.md) ## 参照 - [P0588R1 Simplifying implicit lambda capture](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0588r1.html) From 768f0f229e6401538550aa58fa02c41714e48651 Mon Sep 17 00:00:00 2001 From: yumetodo Date: Wed, 11 Jan 2023 01:07:27 +0900 Subject: [PATCH 2/2] chore: fix typo --- lang/cpp20/simplifying_implicit_lambda_capture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/cpp20/simplifying_implicit_lambda_capture.md b/lang/cpp20/simplifying_implicit_lambda_capture.md index b8cbbf1d8e..08e716257b 100644 --- a/lang/cpp20/simplifying_implicit_lambda_capture.md +++ b/lang/cpp20/simplifying_implicit_lambda_capture.md @@ -35,7 +35,7 @@ void f(int n) { struct A { void f() { n = 2; } // error: nが使われようとしているのは関数定義スコープの中なので、odr-usableではない }; - void g(int = n); // error: nが使われ用としているのはlambda式以外の関数引数スコープの中なので、odr-usableではない + void g(int = n); // error: nが使われようとしているのはlambda式以外の関数引数スコープの中なので、odr-usableではない [=](int k = n) {}; // error: n is not odr-usable due to being // outside the block scope of the lambda-expression [&] { [n]{ return n; }; }; // OK