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

C++20からC++23までの変化

 C++20からC++23までの変化

Akira Takahashi

December 06, 2023
Tweet

More Decks by Akira Takahashi

Other Decks in Programming

Transcript

  1. $͔Β$·Ͱͷ
    มԽ
    ߴڮ থ "LJSB5BLBIBTIJ

    GBJUIBOECSBWF!HNBJMDPN
    1SFGFSSFE/FUXPSLT *OD

    $.*9

    View full-size slide

  2. ͸͡Ίʹ
    • લճͷ$.*9͕೥຤ͩͬͨͷͰɺ$ͷ࿩͕͋·Γ
    Ͱ͖͍ͯ·ͤΜͰͨ͠
    • ͳͷͰࠓճ͸ɺ$ͷ͓͞Β͍ͱɺ$ͷ͔ΜͨΜͳ
    ঺հΛ͠·͢

    View full-size slide

  3. ͜Ε·ͰͷओͳΞοϓσʔτ಺༰Λ͓͞Β͍
    バージョン 主なアップデート内容
    C++98 (1998年) ISOで標準化された最初のバージョン
    C++03 (2003年) C++98で未規定だった仕様の補完 (C++98と同じだと考えていい)
    C++11 (2011年) 初期化⼦リスト、範囲for⽂、型推論、ラムダ式、スレッド、
    スマートポインタなど
    C++14 (2014年) 2進数リテラル、数値リテラルの桁区切り⽂字など
    C++17 (2017年) 構造化束縛、optionalクラス、インライン変数、ファイルシステム
    など
    C++20 (2020年) ⽐較演算⼦の⾃動定義、⽂字列フォーマット、Range、
    テンプレートパラメータの制約、数学定数など

    View full-size slide

  4. $ൺֱԋࢉࢠͷࣗಈఆٛ
    • operator==Λఆٛ͢Δͱɺoperator!=͕ࣗಈఆٛ͞ΕΔ
    • operator<=>Λఆٛ͢Δͱɺoperator<ɺoperator<=ɺ
    operator>ɺoperator>=͕ࣗಈఆٛ͞ΕΔ
    • operator<=> ͷਖ਼໊ࣜশ͸ʮUISFFXBZ DPNQBSJTPOPQFSBUPS
    ࡾํൺֱԋࢉࢠ
    ʯɻӉ஦ધԋࢉࢠͱ΋ݴ͏
    • memcmpؔ਺ͱಉ͡Α͏ʹɺ౳͍͔͠ɺখ͍͔͞ɺେ͖͍͔Λ
    Ұ౓ʹ൑ఆͰ͖Δ

    View full-size slide

  5. $จࣈྻϑΥʔϚοτ
    • std::formatؔ਺͕ೖͬͨ
    • 1ZUIPO෩ͷॻࣜจࣈྻΛ࢖͍ɺॻࣜࢦఆͷจࣈྻΛੜ੒Ͱ͖Δ
    • QSJOUGͷΑ͏ʹܕΛॻࣜͰ͸ࢦఆͤͣɺҾ਺൪߸ ॻࣜΛࢦఆ͢Δ
    • ostringstreamΛ࢖͏ඞཁ͕ ͍͍ͩͨ
    ͳ͘ͳͬͨ
    • ॻࣜจࣈྻ͸ɺίϯύΠϧ࣌ʹνΣοΫ͞ΕΔ
    • constevalͳίϯετϥΫλʹΑͬͯจࣈྻϦςϥϧͷίϯύΠϧ࣌νΣοΫ
    Λ࣮ݱ͍ͯ͠Δ
    cout << format("{} {} {}", 3, 1.23, "hello") << endl;
    cout << format("{0} {0:#x} {1}", 15, "hello") << endl;
    3 1.23 hello
    15 0xf hello

    View full-size slide

  6. $3BOHF
    • ίϯςφ΍ΠςϨʔλൣғͳͲͷ3BOHFʹର͢Δૢ࡞͕ఆٛ͞Εͨ
    • Ͱͷ஗ԆධՁͷ3BOHFΞμϓλʹՃ͑ͯɺͷ3BOHF൛
    ͕std::ranges໊લۭؒʹఆٛ͞ΕΔ
    • ಈ޲తʹ͸ɺ৽نΞϧΰϦζϜ͸std::ranges໊લۭؒʹͷΈఆٛ͞ΕΔ໛༷
    • $Ͱ3BOHFΞμϓλ͕͞Βʹͨ͘͞ΜೖͬͨɻΠϯσοΫε෇͖Ͱϧʔϓ͢Δ
    enumerateͱ͔ͱ͔
    vector v = {1, 2, 3, 4, 5};
    for (auto x : v | filter([](int x) { return x % 2 == 0 })
    | transform([](int x) { return x * 3; })) {
    cout << x << endl;
    }

    View full-size slide

  7. $਺ֶఆ਺
    • ϔομʹɺstd::numbers::piͳͲͷ਺ֶఆ਺͕ఆٛ͞ΕΔ
    • $ίϯύΠϧ࣌ͷؔ਺ධՁ DPOTUFYQS

    • $ม਺ςϯϓϨʔτ
    • $ΠϯϥΠϯม਺ ϔομʹม਺ఆٛͯ͠΋࣮ମΛͻͱͭʹͰ͖Δ

    • $ίϯηϓτ
    • pi͕double൛ɺpi_v͕ςϯϓϨʔτ൛
    template
    T degree_to_radian(T x)
    { return x * std::numbers::pi_v / static_cast(180.0); }
    template
    inline constexpr T pi_v = static_cast(3.14159265358979323846L);

    View full-size slide

  8. $
    • std::print() / std::println()
    • import std;
    • std::expected
    • ίϧʔνϯΛศརʹ࢖͏ͨΊͷstd::generatorΫϥε

    View full-size slide

  9. $QSJOUQSJOUMO
    • std::format()ϕʔεͷग़ྗؔ਺ͱͯ͠ɺ
    std::print()ͱstd::println()͕ೖͬͨ
    • std::println()͸վߦίʔυ෇͖
    • ϔομʹσϑΥϧτͷΦʔόʔϩʔυͱɺ'*-&ͷΦʔόʔ
    ϩʔυ͕ఆٛ͞ΕΔ
    • ϔομʹ͸std::ostream&ͷΦʔόʔϩʔυ͕ఆٛ͞ΕΔ
    • ͨͩ͠ɺstd::cerrͱ͔͸Ͱఆٛ͞ΕΔͷͰ஫ҙ
    println("{} {} {}", 3, 1.23, "hello");
    println("{0} {0:#x} {1}", 15, "hello");
    3 1.23 hello
    15 0xf hello

    View full-size slide

  10. $JNQPSUTUE
    • ඪ४Ϟδϡʔϧͱͯ͠ɺstdͱstd.compat͕ೖͬͨ
    • std͸ɺ$ޓ׵ϥΠϒϥϦΛؚΉશ෦ೖΓͰɺશ෦TUE໊લۭؒʹೖΔ
    • std.compat͸ɺ$ޓ׵ϥΠϒϥϦΛάϩʔόϧ໊લۭؒʹ΋ೖΕΔ
    • ͲͪΒ΋શ෦ೖΓ
    • ͨͩ͠ɺϚΫϩ͸ؚ·Εͳ͍ͷͰassertͱ͔͕ඞཁͳΒΠϯΫϧʔυ͕
    ௥ՃͰඞཁ
    import std;
    int main() {
    std::println("Hello World");
    }

    View full-size slide

  11. $FYQFDUFE
    • ਖ਼ৗ஋͔Τϥʔ஋ͲͪΒ͔͕ೖΔܕͱͯ͠TUEFYQFDUFE͕ೖΔ
    • FYQFDUFEJOU TUSJOHͩͬͨΒਖ਼ৗ஋JOUɺΤϥʔ஋TUSJOH
    • FYQFDUFETUSJOH TUSJOH΋Ͱ͖Δ
    expected safe_divide(double i, double j) {
    if (j == 0) { return unexpected("divide by zero"); }
    else { return i / j; }
    }
    if (auto r = safe_divide(3.0, 2.0); r.has_value()) {
    r.value(); // 正常値を取り出してなにかする
    } else {
    r.error(); // エラー値を取り出してなにかする
    }

    View full-size slide

  12. $HFOFSBUPS
    • $ͷίϧʔνϯΛΑΓ͔ΜͨΜʹ࢖͑Δػೳͱͯ͠TUEHFOFSBUPS5
    Ϋϥε͕ೖͬͨ
    • ੜ੒ͨ͠஋Λ3BOHFͱͯ͠࢖͑Δ
    // 偶数値の無限Rangeを作る関数
    std::generator evens() {
    int n = 0;
    while (true) {
    co_yield n;
    n += 2;
    }
    }
    // 先頭5個だけ使う
    for (int i : evens() | std::views::take(5)) {}

    View full-size slide

  13. ·ͱΊ
    • $ͱ$ͰɺීஈͷϓϩάϥϛϯάΛΑΓ؆୯ʹ͢Δ
    ػೳ͕ͨ͘͞ΜೖΓ·ͨ͠
    • $ͷΞοϓσʔτʹ͍͍͚ͭͯͳ͘ͳΔํ΋૿͑ͯ͘Δͱ
    ࢥ͏ͷͰɺ৘ใൃ৴͕Μ͹Γ·ͬ͢

    View full-size slide

  14. εϙϯαʔืूத
    • IUUQTDQQSFGKQHJUIVCJP
    • $೔ຊޠϦϑΝϨϯεαΠτDQQSFGKQͷεϙϯαʔืूΛ
    ։࢝͠·ͨ͠
    • $ͷ࠷৽৘ใΛ࣋ଓతʹൃ৴͍ͯͨ͘͠Ίʹαϙʔτ͍ͯ͠
    ͚ͨͩΔํΛืू͓ͯ͠Γ·͢
    • ͍͍͓ͨͩͨۚ͸ɺฤूऀʹ෼഑͠·͢

    View full-size slide