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.6k
C++20 射影変換
faithandbrave
0
650
C++26アップデート 2025-03
faithandbrave
0
1.7k
C++26 エラー性動作
faithandbrave
2
1.1k
C++20の整数
faithandbrave
0
230
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
570
C++23 スタックトレースライブラリ
faithandbrave
0
530
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.3k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
Other Decks in Programming
See All in Programming
時間軸から考えるTerraformを使う理由と留意点
fufuhu
16
4.8k
Namespace and Its Future
tagomoris
6
700
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
460
今から始めるClaude Code入門〜AIコーディングエージェントの歴史と導入〜
nokomoro3
0
210
Kiroで始めるAI-DLC
kaonash
2
610
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
310
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
110
FindyにおけるTakumi活用と脆弱性管理のこれから
rvirus0817
0
530
AIコーディングAgentとの向き合い方
eycjur
0
280
私の後悔をAWS DMSで解決した話
hiramax
4
210
rage against annotate_predecessor
junk0612
0
170
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
400
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
Thoughts on Productivity
jonyablonski
70
4.8k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
Become a Pro
speakerdeck
PRO
29
5.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
Designing for humans not robots
tammielis
253
25k
Producing Creativity
orderedlist
PRO
347
40k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
530
KATA
mclloyd
32
14k
Why Our Code Smells
bkeepers
PRO
339
57k
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ͷεϙϯαʔืूΛ ։࢝͠·ͨ͠ • $ ͷ࠷৽ใΛ࣋ଓతʹൃ৴͍ͯͨ͘͠Ίʹαϙʔτ͍ͯ͠
͚ͨͩΔํΛืू͓ͯ͠Γ·͢ • ͍͍͓ͨͩͨۚɺฤूऀʹ͠·͢