Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

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

Miutsuru kariya

February 01, 2018
Tweet

More Decks by Miutsuru kariya

Other Decks in Programming

Transcript

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

    View Slide

  2. 趣旨
    2
    C++

    View Slide

  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

    View Slide

  4. 入れ子名前空間の定義
    4
    導入の背景

    View Slide

  5. 入れ子名前空間の定義
    導入の背景
    5
    namespace A { namespace B { namespace C {
    ・・・
    } } }
    って書くのクソうざいんだが…

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. 入れ子名前空間の定義
    対応
    9
    補足
    inline namespace A::B::C {
    ・・・
    }
    とは書けない…

    View Slide

  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

    View Slide

  11. 16進浮動小数点リテラル
    11
    導入の背景

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. 16進浮動小数点リテラル
    対応
    16
    補足
    16進浮動小数点リテラルは以下の形式
    0xか0X + 仮数部 + pかP + 指数部 + 接尾辞(任意)
    仮数部:16進数(小数点があってもいい)
    指数部:符号(任意) + 10進数
    接尾辞:普通の浮動小数点リテラルと一緒
    表現される数値:仮数部×2^指数部

    View Slide

  17. 16進浮動小数点リテラル
    対応
    17
    更に補足
    iostreamでは16進浮動小数点リテラ
    ルの入力はできない…
    LWG 2381. Inconsistency in parsing floating point numbers

    View Slide

  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

    View Slide

  19. トライグラフの削除
    19
    削除の背景

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. トライグラフの削除
    対応
    26
    余談
    代替トークン一覧
    代替 意味 代替 意味 代替 意味
    <% { and && and_eq &=
    %> } bitor | or_eq |=
    <: [ or || xor_eq ^=
    :> ] xor ^ not !
    %: # compl ~ not_eq !=
    %:%: ## bitand &

    View Slide

  27. テンプレートテンプレートパ
    ラメータでtypenameを
    N4051 Allow typename in a template template parameter
    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4051.html
    27

    View Slide

  28. テンプレートテンプレートパラメー
    タでtypenameを
    28
    背景

    View Slide

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

    View Slide

  30. テンプレートテンプレートパラメー
    タでtypenameを 背景
    30

    template struct A {};
    template using B = int;
    template class X>
    struct C;
    C ca; // ok
    C cb; // ok, not a class template
    template typename X>
    struct D; // error, cannot use typename here

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  34. 式評価順の改善
    34

    View Slide

  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

    View Slide

  36. 式評価順の改善
    36
    導入の背景

    View Slide

  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");
    }

    View Slide

  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");
    }

    View Slide

  39. 式評価順の改善
    導入の背景
    39
    実はこれ、プログラミング言語
    C++第4版からの引用。
    プログラミング言語C++第4版
    でも式の評価順で間違えるの
    ヤバくない?

    View Slide

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

    View Slide

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

    View Slide

  42. 式評価順の改善
    対応
    42
    新たに評価順の規定対象となる演算子
    a.b;
    a->b;
    a->*b;
    a(b1, b2, b3);
    b @= a;
    a[b];
    a << b;
    a >> b;
    みんなaが先に評価されるようになった
    すごいぞ C++17!!!

    View Slide

  43. 式評価順の改善
    対応
    43
    更に、関数呼び出しの各引数の評価順
    は unsequenced(評価順の規定無し)か
    ら indeterminately sequenced(どの順序
    で評価されるかは規定無し)になった!
    すごいぞ C++17!!!
    ※ unsequenced は各評価がオーバーラップしても良いが、
    indeterminately sequenced はオーバーラップNG

    View Slide

  44. 式評価順の改善
    対応
    44
    更に、演算子関数をオーバーロードした
    場合でも、元の演算子の評価順が保た
    れるようになった!!!
    すごいぞ C++17!!!
    でも gcc だとカンマ演算子とかの引数評価順が保たれない…

    View Slide

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

    View Slide

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

    View Slide