static_assertのラムダ式での挙動
先日Qiitaに記事を投稿したのですが、static_assertの条件式で[]{return false;}()
を使ったときもtwo-phase name lookupの2phase目と思われるときに評価されるコンパイラの挙動は規格的に信用してもいいのでしょうか。
総称ラムダの場合、[temp.inst]/10に
...総称ラムダのインスタンス化は、呼び出し演算子テンプレートがインスタンス化されない限り、その複合ステートメント内のif constexprステートメントのサブステートメントのインスタンス化を必要としません。...
(google翻訳を少し編集)
とあるのですが...
Thanks for any help! :)
該当のソースコード
cpp
1if constexpr (true); 2else static_assert([]{return false;}(), "..."); // 評価される?
個人的にはただのlambdaは依存名じゃないから破棄文になるまえに評価されてstatic_assert発動説を推しておきたい。clangとmsvc19.16はそんな感じの実装。gccはerror: could not convert '<lambda closure object>main()::<lambda()>{}.main()::<lambda()>()' from 'void' to 'bool'とか言ってて意味わからん。
yometodoさん、コメントありがとうございます!
手元でwandboxで、main関数内に書いて実行してみたところ、確かにそんな出力になりました!
Qiitaの記事内での文脈で使うとコンパイルエラーにならなかったので、ちょっと不思議だったのですが、これはコンパイラのバグかもしれないですね...
わざわざ規格でgeneric lambdaを指定しているあたり、私もstatic_assert発動説が有力だと思います!
ところで規格ってどれ見てますか?n4659見てるんですが[temp.inst]/10にお示しのような内容を見つけられない
n4741です!n4659だと[temp.inst]/11?..(多分違う...)
4741ってすごい中途半端では・・・。C++2aという意味合いなら4791あたりを見てくるべきでは
n4659だと[temp.inst]/9だった、一個上に気が付かない集中力なのでネます
yumetodoさん
ほんとですか!ありがとうございます!!
前にブクマしたのをそのまま見てましたorz
ところで4791ってどこで見れますか?
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/
に見当たりません...!
githubの方にあるかなと
yumetodoさん
githubに新しいものがあるとは知りませんでした!
ありがとうございました!!
回答1件
あなたの回答
tips
プレビュー