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++26アップデート 2025-03
Search
Akira Takahashi
April 25, 2025
Technology
0
1.7k
C++26アップデート 2025-03
Akira Takahashi
April 25, 2025
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
2.7k
C++20 射影変換
faithandbrave
0
680
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
230
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
580
C++23 スタックトレースライブラリ
faithandbrave
0
540
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.3k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Technology
See All in Technology
“2件同時配達”の開発舞台裏 〜出前館PMが挑んだダブルピック実現に向けた体験設計〜
demaecan
0
180
Why React!?? Next.jsそしてReactを改めてイチから選ぶ
ypresto
10
4.1k
自作LLM Native GORM Pluginで実現する AI Agentバックテスト基盤構築
po3rin
2
230
OCI Network Firewall 概要
oracle4engineer
PRO
1
7.7k
Function calling機能をPLaMo2に実装するには / PFN LLMセミナー
pfn
PRO
0
820
about #74462 go/token#FileSet
tomtwinkle
1
270
GopherCon Tour 概略
logica0419
2
160
#普通の文系サラリーマンチャレンジ 自分でアプリ開発と電子工作を続けたら人生が変わった
tatsuya1970
0
910
DataOpsNight#8_Terragruntを用いたスケーラブルなSnowflakeインフラ管理
roki18d
1
320
インサイト情報からどこまで自動化できるか試してみた
takas0522
0
130
AI ReadyなData PlatformとしてのAutonomous Databaseアップデート
oracle4engineer
PRO
0
140
後進育成のしくじり〜任せるスキルとリーダーシップの両立〜
matsu0228
3
1.2k
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
We Have a Design System, Now What?
morganepeng
53
7.8k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
53k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Scaling GitHub
holman
463
140k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
45
2.5k
Transcript
C++26 アップデート 2025-03 高橋 晶 (Akira Takahashi)
[email protected]
Preferred Networks,
Inc. 2025/04/25 (金) C++ MIX #14
C++26 2025-03 • 今回は、2025-03 mailingとしてC++26 Working Draftに入った 変更を紹介していきます • 今回でC++26仕様は一旦できたらしい
• このあとは仕様バグの修正や、各国からのコメントへの対応などがあ る
constexpr unionによる遅延初期化 • 配列要素の初期化を遅延させるための手法 としてunionが使われていたが、constexpr をつけるとコンパイラによって動かなかっ たりした • C++26では明確に許可される template
<class T, int N> class FixedVector { union U { constexpr U() { } constexpr ~U() { } T storage[N]; }; size_t size = 0; … };
タイムトラベル最適化を防止するstd::observable() • DIEを定義しない場合、inc(nullptr)は未 定義動作になることが保証されるため、 bad()をそもそも呼び出さないタイムト ラベル最適化が行われる • C++26ではstd::observable()という関数 でチェックポイントを設定すると、 時間分割されてチェックポイントを跨い
だタイムトラベル最適化が防止される • C++26の標準出力関係にはチェックポ イントが設定される static void bad(const char *msg) { std::fputs(msg, stderr); #ifdef DIE std::abort(); #endif } void inc(int *p) { if(!p) bad("Null! n"); ++*p; // !p時にここで未定義動作 }
契約プログラミング • 3つの契約機能 • 関数の事前条件pre • 関数の事後条件post • 契約アサーションcontract_assert •
postは戻り値に変数名をつけて使用 してもいいし、使用しなくてもいい • pre/postは文脈依存キーワード (変数名とかに使える) • コンパイラに契約モードの設定が追 加される想定 int f(const int x) pre (x != 1) post (r: r == x && r != 2) { contract_assert(x != 3); return x; } void clear() post (empty()) { … }
memory_order::consume関係を非推奨化 • consumeメモリオーダーは、並行プログラムにおいて、 読み込んだ値に依存した操作の実行順序を保証するもの • 実際はconsume相当の順序保証はどのメモリオーダーにも付くのと、 コンパイラがconsume特化の実装をしなかったので非推奨化する • 関連してstd::kill_dependency()と[[carries_dependency]]も非推奨化 std::atomic<T>
x = …; int a = x.load(memory_order::consume); // 非推奨 int b = a + 1; int c = b + 1;
コンセプトと変数テンプレートの テンプレートテンプレートパラメータ対応 • コンセプトと変数テンプレート に、テンプレートテンプレート パラメータが使えるようになる • テンプレートテンプレートパラ メータは、テンプレート引数を あとで指定する機能
template< template <typename T> concept C, template <typename T> auto V > struct S { concept D = C<int>; constexpr auto X = V<int>; }; template <typename T> concept Concept = true; template <typename T> constexpr auto Var = 42; S<Concept, Var> s;
トリビアルな再配置 • trivially relocatable (トリビアルな再 配置) は、memcpyやビットコピーで 再配置ができる性質 • 型にこの性質を与えることで、ムーブ
元オブジェクトのデストラクタ呼び出 しなどを省略できる • そのために文脈依存キーワードが2つ 追加される (それと対応した型特性も) template <class T> class optional trivially_relocatable_if_eligible replaceable_if_eligible { union { T d_object; }; bool d_engaged{false}; … };
#embed : プリプロセス時ファイル読み込み • #includeのように使える ファイル読み込み機能 • 上限のバイト数や、先頭列、末尾列、 空であった場合のデータなどを指定 できる
// 無限サイズのファイル"dev/urandom" // から最大4バイトを読む const unsigned char random[] = { #embed "/dev/urandom" limit(4) }; constexpr int seed = 0; for (int i = 0; i < 4; i++) { seed |= random[i] << (i * 8); } constexpr std::mt19937 gen{seed};
vector / string以外のコンテナをconstexpr対応 • C++20でstd::vectorとstd::stringが constexprで使えるようになった • C++26では、ほかの標準コンテナも すべてconstexpr対応する constexpr
R f() { std::map<std::string, int> m = { … }; if (m.contains("key")) { … } … }
hive : 要素のメモリ位置が安定するシーケンスコンテナ • 双方向Rangeのシーケンスコンテナ std::hiveが追加される • 要素の追加・削除をしても、メモリ位 置は変わらない •
ゲーム、HPC、物理シミュレーション など幅広い分野で使われてきたデータ 構造 std::hive<int> ls = {1, 2, 3}; // 要素を追加。 // {4, 5}の新たなメモリブロックが確保される // {1, 2, 3}のメモリ位置は変わらない ls.insert({4, 5}); // 要素3を削除。 // {4, 5}のメモリ位置は変わらない ls.erase(std::next(ls.begin(), 2));
indirectとpolymorphic : 値の意味論をもつ動的確保オブジェクト • indirectとpolymorphicは、動的確保し たオブジェクトのポインタに、値の意 味論をもたせるもの • コピー時にポインタのコピーではなく、 参照先の値をコピー
(ディープコピー) する • pImplイディオムもunique_ptrの変わり にindirectを使える class ForwardListNode { int data_; indirect<ForwardListNode> next_; }; class ForwardList { indirect<ForwardListNode> head_; }; class Composite { indirect<A> a_; polymorphic<X> x_; public: template <class Derived> Composite(const A& a, const Derived& x) : a_{a}, x_{std::in_place_type<Derived>, x} {} };
今回は以上です! • C++26のアップデートや、 それぞれの機能を掘り下げる発表は 今後もやっていきます