From 16dc8d085fb09db570eeafc22213a8d46e91b22d Mon Sep 17 00:00:00 2001 From: sokamu_kuruga Date: Tue, 8 Jan 2019 03:53:17 +0900 Subject: [PATCH] update(if constexpr): added way using lambda ref. https://qiita.com/alphya/items/b3463d1a2f53687f6025 https://teratail.com/questions/166409 --- lang/cpp17/if_constexpr.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/lang/cpp17/if_constexpr.md b/lang/cpp17/if_constexpr.md index 6f8f756bd4..4c89ea7dee 100644 --- a/lang/cpp17/if_constexpr.md +++ b/lang/cpp17/if_constexpr.md @@ -111,6 +111,26 @@ int main() } ``` +上の例では`false_v`を作ったが、lambda式でも同様のことができる。lambda式はそれが記述された位置から見て最小のスコープ(ブロックスコープ/クラススコープ/名前空間スコープ)で宣言されるクラスとして扱われる。例えば、下の例では`f`というテンプレート関数内で宣言される。テンプレート関数内のクラスは依存名になるため、テンプレートの宣言時に検証されず、テンプレート実体化まで評価を遅らせる事ができる。 + +```cpp example +#include +template +void f(T) +{ + if constexpr (std::is_same_v) + { + // Tがintのときのみ発動する + static_assert([]{return false;}()); + } +} +int main() +{ + f(2.4); + f(3); +} +``` + `if constexpr`文の条件式内は実体化が起きる。したがって実体化するとコンパイルエラーになるものは書いてはいけない。 ```cpp example