C++17を知るその4~教育委員会~

なんだかんだと4回目を迎えたC++17。
ほぼ
https://cpprefjp.github.io/lang/cpp17.html
をなぞっているだけですがとりあえずまだやっていきます。

今回は制御構造に関するC++17

・if文とswitch文の条件式と初期化を分離

これだけだとわかったようなわからないような感じですが
初期化に関することで例えば従来だとfor文で

こう書くとforで定義されたiはfor文内でのみ有効でそれ以外でiを使おうとするエラーです。

これをC++17ではif文でも初期化式として
if (初期化式; 条件式)
てな感じで書けるので、

上記のようになります。
setは重複を許さないので重複しているかどうかのチェックです。C++17じゃない場合は

でしょうか。ただ今回の例であればif(st.insert(3))で済みますが。
これがelseとかで正常に登録されたstを使って何かする、とかであればこうもいかないので便利になったでしょう。

switchに関してもifの条件式がswitchに代わるぐらいです。

for文でできるんだからif,switchであってもおかしくないのでよかったのではないかと思います。

・[[fallthrough]]属性
前回やったので割愛

・if constexpr 文
コンパイル時に条件分岐する文。
これもわかったようなわからないような。ちなみにD言語でもstatic ifとかでコンパイル時評価されるらしいがD言語は知らない..
テンプレートのインスタンス化時(コンパイル時)に、どの実装を生成するかを簡潔に書けるようになるのだが
このあたりテンプレートが絡んでくるのでそもそもテンプレートをよく知らないのであれば
なんのこっちゃということになる。

このあたりははっきりこのあたりを読んでようやく理解
https://qiita.com/saka1_p/items/e8c4dfdbfa88449190c5
https://cpplover.blogspot.jp/2017/05/constexpr-if.html
https://github.com/EzoeRyou/cpp17book/blob/master/028-cpp17-core-constexpr-if.md

例で挙げられているコンパイル時に条件分岐させたいものとすれば型、intやfloat,doubleなどコンパイル時にわかっているのであれば
そこで決めてしまう。もし意図しない型であればコンパイルエラーとなって動いているときに
変な動きにならないのでよく知らずに使っても事前に防げるということだ。

参考ページそのままのコードとなってしまうが上記のように型がintの場合は意図しないとしてエラーにしたいが
コメントの通り常にエラーとなってしまう。
(static_assertはコンパイル時アサートをチェックするための関数)

理由としてはテンプレート仮引数Tに依存していないため、テンプレートの宣言時に検証され、エラーとなる。
逆に言えば仮引数Tに依存しているようになればOKということである。

言われてみればなるほどねーとなるのだが自分の頭ではなかなかこういった解法が思いつかないので
勉強になる。

・範囲 for ループの制限緩和
begin と end の型が同じでなければならなかった。 C++17 でこの制限が緩和された。

そもそもC++11でfor文が

とすっきりかけるようになった。

範囲for文は
for ( for-range-declaration : for-range-initializer ) statement
となるのだが

このような展開がされるので__beginと__endが同じ型でなければいけなかった。が、

C++17では上記のような形で展開されるようになったので__beginと__endが異なっていてもよくなった。

こちらの例で載っているがbeginとendがそれぞれ異なる方になっているがOKとなっている
https://cpprefjp.github.io/lang/cpp17/generalizing_the_range-based_for_loop.html

今まで同じ型だけだったことで苦労したことはなかったと思うがそれはただ単にそんなことを思いつきも
しなかっただけなので使えるとなるといろいろとケースがでてくるだろう..たぶん。

今回テンプレート関連など正直そのあたりをちゃんとやらないといけない感じだったなあ..
まあC++17だけでなく今後何かしらC++やる場合はそのあたりをちゃんとできればいいが果たしてその日は来るのか。

過去分
C++17を知るその1
C++17を知るその2
C++17を知るその3

参考URL
C++日本語リファレンス
if constexprを使うとき、特定条件時にコンパイルを失敗させる
constexpr ifの落とし穴
constexpr if文 : コンパイル時条件分岐

About the author

naito06

C++やったり、PythonやったりPHPだったり。

Add Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

By naito06

最近の投稿

アーカイブ

カテゴリー

タグクラウド

コーポレートサイト