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
12k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C++20からC++23までの変化
Akira Takahashi
December 06, 2023
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
3.2k
C++20 射影変換
faithandbrave
0
870
C++26アップデート 2025-03
faithandbrave
0
2.2k
C++26 エラー性動作
faithandbrave
2
1.3k
C++20の整数
faithandbrave
0
300
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
670
C++23 スタックトレースライブラリ
faithandbrave
0
640
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.6k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.3k
Other Decks in Programming
See All in Programming
Flow は今どうなっているか
mizdra
PRO
0
820
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
180
Go 1.27からのGODEBUG / Go 1.27 リリースパーティ #go127party
mazrean
0
270
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
280
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.6k
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
710
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
200
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
400
Press start. Python's next generation.
willingc
PRO
3
300
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
250
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
360
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
570
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
463
34k
It's Worth the Effort
3n
188
29k
Fireside Chat
paigeccino
42
4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Embracing the Ebb and Flow
colly
88
5.2k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
180
A designer walks into a library…
pauljervisheath
211
24k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
700
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ͷεϙϯαʔืूΛ ։࢝͠·ͨ͠ • $ ͷ࠷৽ใΛ࣋ଓతʹൃ৴͍ͯͨ͘͠Ίʹαϙʔτ͍ͯ͠
͚ͨͩΔํΛืू͓ͯ͠Γ·͢ • ͍͍͓ͨͩͨۚɺฤूऀʹ͠·͢