質問: ### static_assertのラムダ式での挙動 先日Qiitaに記事を投稿したのですが、static_assertの条件式で`[]{return false;}()`を使ったときもtwo-phase name lookupの2phase目と思われるときに評価されるコンパイラの挙動は規格的に信用してもいいのでしょうか。 総称ラムダの場合、[temp.inst]/10に > > ...総称ラムダのインスタンス化は、呼び出し演算子テンプレートがインスタンス化されない限り、その複合ステートメント内のif constexprステートメントのサブステートメントのインスタンス化を必要としません。... > > (google翻訳を少し編集) > > > とあるのですが... Thanks for any help! :) ### 該当のソースコード ``` if constexpr (true); else static_assert([]{return false;}(), "..."); // 評価される? ```
回答: こんにちは。 もともとconstexpr ifはテンプレート引数に依存しているものの実体化を遅延する効果がありますが、提示されているコードはテンプレート引数がそもそもないので、実体化の遅延効果は期待できないと思います。 そして、N4171の該当のNoteは「ジェネリックラムダ」についての注意書きですね。 ご提示のコードはジェネリックラムダではないので定義した時点で実体化されます。 文脈的に下記のようなケースを想定した注意書きのような気がします。(通常のラムダはテンプレートではないですが、ジェネリックラムダはテンプレートなので、その辺りを特記した。) ``` #include int main() { auto assert_int =  { if constexpr (std::is_integral{}); else static_assert(std::is_integral{}, "..."); }; assert_int(123); // assert_int("abc"); // static_assert!! } ```