Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++20からC++23までの変化
Search
Akira Takahashi
December 06, 2023
Programming
9
12k
C++20からC++23までの変化
Akira Takahashi
December 06, 2023
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
2.5k
C++20 射影変換
faithandbrave
0
620
C++26アップデート 2025-03
faithandbrave
0
1.6k
C++26 エラー性動作
faithandbrave
2
1.1k
C++20の整数
faithandbrave
0
220
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
550
C++23 スタックトレースライブラリ
faithandbrave
0
520
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.2k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
Other Decks in Programming
See All in Programming
UbieのAIパートナーを支えるコンテキストエンジニアリング実践
syucream
1
150
技術的負債で信頼性が限界だったWordPress運用をShifterで完全復活させた話
rvirus0817
1
1.7k
ゲームの物理
fadis
5
1.1k
大規模FlutterプロジェクトのCI実行時間を約8割削減した話
teamlab
PRO
0
480
Gemini CLIの"強み"を知る! Gemini CLIとClaude Codeを比較してみた!
kotahisafuru
3
1.1k
WebAssemblyインタプリタを書く ~Component Modelを添えて~
ruccho
1
830
バイブコーディング × 設計思考
nogu66
0
120
tool ディレクティブを導入してみた感想
sgash708
1
100
AIレビュアーをスケールさせるには / Scaling AI Reviewers
technuma
2
180
DynamoDBは怖くない!〜テーブル設計の勘所とテスト戦略〜
hyamazaki
1
200
画像コンペでのベースラインモデルの育て方
tattaka
3
1.7k
Flutterと Vibe Coding で個人開発!
hyshu
1
250
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
Producing Creativity
orderedlist
PRO
347
40k
Making Projects Easy
brettharned
117
6.3k
Side Projects
sachag
455
43k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Code Reviewing Like a Champion
maltzj
525
40k
A better future with KSS
kneath
239
17k
BBQ
matthewcrist
89
9.8k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Automating Front-end Workflow
addyosmani
1370
200k
Designing for Performance
lara
610
69k
For a Future-Friendly Web
brad_frost
179
9.9k
Transcript
$ ͔Β$ ·Ͱͷ มԽ ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD
ਫ $ .*9
͡Ίʹ • લճͷ$ .*9͕ͩͬͨͷͰɺ$ ͷ͕͋·Γ Ͱ͖͍ͯ·ͤΜͰͨ͠ • ͳͷͰࠓճɺ$ ͷ͓͞Β͍ͱɺ$ ͷ͔ΜͨΜͳ
հΛ͠·͢
͜Ε·ͰͷओͳΞοϓσʔτ༰Λ͓͞Β͍ バージョン 主なアップデート内容 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、 テンプレートパラメータの制約、数学定数など
$ ൺֱԋࢉࢠͷࣗಈఆٛ • operator==Λఆٛ͢Δͱɺoperator!=͕ࣗಈఆٛ͞ΕΔ • operator<=>Λఆٛ͢Δͱɺoperator<ɺoperator<=ɺ operator>ɺoperator>=͕ࣗಈఆٛ͞ΕΔ • operator<=> ͷਖ਼໊ࣜশʮUISFFXBZ
DPNQBSJTPOPQFSBUPS ࡾํൺֱԋࢉࢠ ʯɻӉધԋࢉࢠͱݴ͏ • memcmpؔͱಉ͡Α͏ʹɺ͍͔͠ɺখ͍͔͞ɺେ͖͍͔Λ ҰʹఆͰ͖Δ
$ จࣈྻϑΥʔϚοτ • 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
$ 3BOHF • ίϯςφΠςϨʔλൣғͳͲͷ3BOHFʹର͢Δૢ࡞͕ఆٛ͞Εͨ • <ranges>ͰͷԆධՁͷ3BOHFΞμϓλʹՃ͑ͯɺ<algorithm>ͷ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; }
$ ֶఆ • <numbers>ϔομʹɺstd::numbers::piͳͲͷֶఆ͕ఆٛ͞ΕΔ • $ ίϯύΠϧ࣌ͷؔධՁ DPOTUFYQS • $
มςϯϓϨʔτ • $ ΠϯϥΠϯม ϔομʹมఆ࣮ٛͯ͠ମΛͻͱͭʹͰ͖Δ • $ ίϯηϓτ • pi͕double൛ɺpi_v͕ςϯϓϨʔτ൛ template <class T> T degree_to_radian(T x) { return x * std::numbers::pi_v<T> / static_cast<T>(180.0); } template <class T> inline constexpr T pi_v = static_cast<T>(3.14159265358979323846L);
$ • std::print() / std::println() • import std; •
std::expected • ίϧʔνϯΛศརʹ͏ͨΊͷstd::generatorΫϥε
$ QSJOUQSJOUMO • std::format()ϕʔεͷग़ྗؔͱͯ͠ɺ std::print()ͱstd::println()͕ೖͬͨ • std::println()վߦίʔυ͖ • <print>ϔομʹσϑΥϧτͷΦʔόʔϩʔυͱɺ'*-& ͷΦʔόʔ
ϩʔυ͕ఆٛ͞ΕΔ • <ostream>ϔομʹstd::ostream&ͷΦʔόʔϩʔυ͕ఆٛ͞ΕΔ • ͨͩ͠ɺstd::cerrͱ͔<iostream>Ͱఆٛ͞ΕΔͷͰҙ println("{} {} {}", 3, 1.23, "hello"); println("{0} {0:#x} {1}", 15, "hello"); 3 1.23 hello 15 0xf hello
$ JNQPSUTUE • ඪ४Ϟδϡʔϧͱͯ͠ɺstdͱstd.compat͕ೖͬͨ • stdɺ$ޓϥΠϒϥϦΛؚΉશ෦ೖΓͰɺશ෦TUE໊લۭؒʹೖΔ • std.compatɺ$ޓϥΠϒϥϦΛάϩʔόϧ໊લۭؒʹೖΕΔ • ͲͪΒશ෦ೖΓ
• ͨͩ͠ɺϚΫϩؚ·Εͳ͍ͷͰassertͱ͔͕ඞཁͳΒΠϯΫϧʔυ͕ ՃͰඞཁ import std; int main() { std::println("Hello World"); }
$ FYQFDUFE • ਖ਼ৗ͔ΤϥʔͲͪΒ͔͕ೖΔܕͱͯ͠TUEFYQFDUFE͕ೖΔ • FYQFDUFEJOU TUSJOHͩͬͨΒਖ਼ৗJOUɺΤϥʔTUSJOH • FYQFDUFETUSJOH TUSJOHͰ͖Δ
expected<double, string> 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(); // エラー値を取り出してなにかする }
$ HFOFSBUPS • $ ͷίϧʔνϯΛΑΓ͔ΜͨΜʹ͑Δػೳͱͯ͠TUEHFOFSBUPS5 Ϋϥε͕ೖͬͨ • ੜͨ͠Λ3BOHFͱͯ͑͠Δ // 偶数値の無限Rangeを作る関数
std::generator<int> evens() { int n = 0; while (true) { co_yield n; n += 2; } } // 先頭5個だけ使う for (int i : evens() | std::views::take(5)) {}
·ͱΊ • $ ͱ$ ͰɺීஈͷϓϩάϥϛϯάΛΑΓ؆୯ʹ͢Δ ػೳ͕ͨ͘͞ΜೖΓ·ͨ͠ • $ ͷΞοϓσʔτʹ͍͍͚ͭͯͳ͘ͳΔํ૿͑ͯ͘Δͱ ࢥ͏ͷͰɺใൃ৴͕ΜΓ·ͬ͢
εϙϯαʔืूத • IUUQTDQQSFGKQHJUIVCJP • $ ຊޠϦϑΝϨϯεαΠτDQQSFGKQͷεϙϯαʔืूΛ ։࢝͠·ͨ͠ • $ ͷ࠷৽ใΛ࣋ଓతʹൃ৴͍ͯͨ͘͠Ίʹαϙʔτ͍ͯ͠
͚ͨͩΔํΛืू͓ͯ͠Γ·͢ • ͍͍͓ͨͩͨۚɺฤूऀʹ͠·͢