C++17の新機能 言語編 / new features of C++17 - language

C++17の新機能 言語編 / new features of C++17 - language

C++17 で追加された言語機能の紹介です。
(言語編といっても、全言語機能を網羅しているわけじゃないです…)

説明がだいぶ雑ですが、許してください…

4cd53d17fd7e26f611822b508963f613?s=128

Miutsuru kariya

February 01, 2018
Tweet

Transcript

  1. C++17 の新機能 言語編 2018/2/1 鳥頭かりやマン 1

  2. 趣旨 2 C++

  3. 入れ子名前空間の定義 N4026 Nested namespace definition http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4026.html N4116 Nested Namespace Definition

    (rev 1) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4116.pdf N4230 Nested namespace definition (revision 2) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html 3
  4. 入れ子名前空間の定義 4 導入の背景

  5. 入れ子名前空間の定義 導入の背景 5 namespace A { namespace B { namespace

    C { ・・・ } } } って書くのクソうざいんだが…
  6. 入れ子名前空間の定義 6 対応

  7. 入れ子名前空間の定義 対応 7 namespace A::B::C { ・・・ } って書けるようにしよう!

  8. 入れ子名前空間の定義 対応 8 完

  9. 入れ子名前空間の定義 対応 9 補足 inline namespace A::B::C { ・・・ }

    とは書けない…
  10. 16進浮動小数点リテラル P0245R0 Hexadecimal floating literals for C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0245r0.html P0245R1 Hexadecimal

    floating literals for C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0245r1.html 10
  11. 16進浮動小数点リテラル 11 導入の背景

  12. 16進浮動小数点リテラル 導入の背景 12 1. 16進浮動小数点、ライブラリは 対応してるのにソースに書けな いのおかしい! 2. IEEE-754の2進浮動小数点 フォーマットみたいな2進浮動小

    数点数を正確に表現したい!
  13. 16進浮動小数点リテラル 13 対応

  14. 16進浮動小数点リテラル 対応 14 採用!

  15. 16進浮動小数点リテラル 対応 15 完

  16. 16進浮動小数点リテラル 対応 16 補足 16進浮動小数点リテラルは以下の形式 0xか0X + 仮数部 + pかP

    + 指数部 + 接尾辞(任意) 仮数部:16進数(小数点があってもいい) 指数部:符号(任意) + 10進数 接尾辞:普通の浮動小数点リテラルと一緒 表現される数値:仮数部×2^指数部
  17. 16進浮動小数点リテラル 対応 17 更に補足 iostreamでは16進浮動小数点リテラ ルの入力はできない… LWG 2381. Inconsistency in

    parsing floating point numbers
  18. トライグラフの削除 N3981 Removing trigraphs??! http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3981.html N4086 Removing trigraphs??! http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4086.html N4210

    IBM comment on preparing for a Trigraph-adverse future in C++17 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4210.pdf 18
  19. トライグラフの削除 19 削除の背景

  20. トライグラフの削除 削除の背景 20 いまどきトライグラ フじゃないと入力で きない文字コード 使ってるとかwwww

  21. トライグラフの削除 21 対応

  22. トライグラフの削除 対応 22 削除

  23. トライグラフの削除 対応 23 ちなみに、ソースファイル からソースキャラクタセット への変換は処理系定義だ からサポートし続けたかっ たら勝手にやって

  24. トライグラフの削除 対応 24 IBMオコ

  25. トライグラフの削除 対応 25 余談 代替トークンは削除されて ないから積極的に使って いこうな!

  26. トライグラフの削除 対応 26 余談 代替トークン一覧 代替 意味 代替 意味 代替

    意味 <% { and && and_eq &= %> } bitor | or_eq |= <: [ or || xor_eq ^= :> ] xor ^ not ! %: # compl ~ not_eq != %:%: ## bitand &
  27. テンプレートテンプレートパ ラメータでtypenameを N4051 Allow typename in a template template parameter

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4051.html 27
  28. テンプレートテンプレートパラメー タでtypenameを 28 背景

  29. テンプレートテンプレートパラメー タでtypenameを 背景 29 C++11 でエイリアステンプ レート入ったから、テンプレー トテンプレートパラメータって class とは限らなくね?

  30. テンプレートテンプレートパラメー タでtypenameを 背景 30 例 template<typename T> struct A {};

    template<typename T> using B = int; template<template<typename> class X> struct C; C<A> ca; // ok C<B> cb; // ok, not a class template template<template<typename> typename X> struct D; // error, cannot use typename here
  31. テンプレートテンプレートパラメー タでtypenameを 31 対応

  32. テンプレートテンプレートパラメー タでtypenameを 対応 32 せやな

  33. テンプレートテンプレートパラメー タでtypenameを 対応 33 完

  34. 式評価順の改善 34

  35. 式評価順の改善 N4228 Refining Expression Evaluation Order for Idiomatic C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4228.pdf

    P0145R0 Refining Expression Evaluation Order for Idiomatic C++ (Revision 1) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0145r0.pdf P0145R1 Refining Expression Evaluation Order for Idiomatic C++ (Revision 2) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r1.pdf P0145R2 Refining Expression Evaluation Order for Idiomatic C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r2.pdf P0145R3 Refining Expression Evaluation Order for Idiomatic C++ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf 35
  36. 式評価順の改善 36 導入の背景

  37. 式評価順の改善 導入の背景 37 次のプログラムには間違いがあります。どこでしょう? void f() { std::string s =

    "but I have heard it works even if you don’t believe in it"; s.replace(0, 4, "").replace(s.find("even"), 4, "only") .replace(s.find(" don’t"), 6, ""); assert(s == "I have heard it works only if you believe in it"); }
  38. 式評価順の改善 導入の背景 38 赤いところの評価順によってはassert失敗する。 void f() { std::string s =

    "but I have heard it works even if you don’t believe in it"; s.replace(0, 4, "").replace(s.find("even"), 4, "only") .replace(s.find(" don’t"), 6, ""); assert(s == "I have heard it works only if you believe in it"); }
  39. 式評価順の改善 導入の背景 39 実はこれ、プログラミング言語 C++第4版からの引用。 プログラミング言語C++第4版 でも式の評価順で間違えるの ヤバくない?

  40. 式評価順の改善 40 対応

  41. 式評価順の改善 対応 41 式の評価順を規定しよう! ただし一部の演算子のみね…

  42. 式評価順の改善 対応 42 新たに評価順の規定対象となる演算子 a.b; a->b; a->*b; a(b1, b2, b3);

    b @= a; a[b]; a << b; a >> b; みんなaが先に評価されるようになった すごいぞ C++17!!!
  43. 式評価順の改善 対応 43 更に、関数呼び出しの各引数の評価順 は unsequenced(評価順の規定無し)か ら indeterminately sequenced(どの順序 で評価されるかは規定無し)になった!

    すごいぞ C++17!!! ※ unsequenced は各評価がオーバーラップしても良いが、 indeterminately sequenced はオーバーラップNG
  44. 式評価順の改善 対応 44 更に、演算子関数をオーバーロードした 場合でも、元の演算子の評価順が保た れるようになった!!! すごいぞ C++17!!! でも gcc

    だとカンマ演算子とかの引数評価順が保たれない…
  45. 式評価順の改善 対応 45 更に、new 式では必ず初期化子の評価 よりアロケーション関数呼び出しの方が 先であることが規定された!!! すごいぞ C++17!!!

  46. 式評価順の改善 対応 46 完