サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
中東情勢
onihusube.hatenablog.com
文書の一覧 JTC1/SC22/WG21 - Papers 2024 mailing2024-02 全部で112本あります。 もくじ P0493R5 Atomic maximum/minimum P0843R10 inplace_vector P0876R15 fiber_context - fibers without scheduler P1061R7 Structured Bindings can introduce a Pack P1144R10 std::is_trivially_relocatable P1729R4 Text Parsing P2047R7 An allocator-aware optional type P2075R4 Philox as an extension of the C++ RNG engines P2249R5 Mixed comparison
初期化せずに初期化する。一見矛盾しているようにしか思えない行いはしかし、生配列の場合は次のように初期化しながら初期化しないことによって行うことができます int main() { int array_uninit[5]; // 各要素は未初期化 int array_zeroinit[5]{}; // 各要素は0で初期化 } この時std::arrayで同様に初期化しながら初期化しないことを行うにはどうすればいいのでしょうか?クラス型の場合、初期化をしない初期化(デフォルト初期化)の場合でもデフォルトコンストラクタが呼ばれてしまうため、なんとなくできないような気がしてしまいます。 先に結論を書いておくと、生配列と全く同様の書き方によって全く同様の初期化を行うことができます。 int main() { std::array<int, 5> array_uninit; // 各要素は未初期化 s
文書の一覧 JTC1/SC22/WG21 - Papers 2024 mailing2024-01 全部で22本あります。 もくじ P1255R11 A view of 0 or 1 elements: views::maybe P1255R12 A view of 0 or 1 elements: views::maybe P1709R5 Graph Library P2019R5 Thread attributes P2527R3 std::variant_alternative_index and std::tuple_element_index P2664R6 Proposal to extend std::simd with permutation API P2748R3 Disallow Binding a Returned Glvalue to a Temporary P27
文書の一覧 JTC1/SC22/WG21 - Papers 2022 mailing2023-10 全部で80本あります。 もくじ N4961 2024-03 Tokyo meeting information N4962 WG21 agenda: 6-11 November 2023, Kona, HI N4963 2023 WG21 admin telecon meetings, rev. 2 N4964 Working Draft, Programming Languages -- C++ N4965 Editors' Report, Programming Languages -- C++ P0447R23 Introduction of std::hive to the standard library P0876R14 fiber_context - fibers withou
この記事はC++アドベントカレンダー2023 25日目の記事です。ご参加の皆様お疲れ様でした! C++ Contracts C++20 Contracts 問題点とMVP(Minimum Viable Product) 最初のMVP仕様 関数の再宣言と契約注釈 引数の事後条件からの参照 契約条件式の副作用 C++26に向けたロードマップ 契約注釈のセマンティクス 違反ハンドラ 構文 C++26に向けて、残りの問題 2023年末時点でのMVP 参考文献 C++ Contracts ContractとはContract programmingの略称で、C++ ContractsとはC++における契約プログラミング機能を指す言葉です(sは付いたり付かなかったりします)。 C++ Contractsとは、契約プログラミングという考え方に基づいた設計(契約による設計)をより自然に行えるようにするため
C++26より、使用しない値に対する共通した変数名として_(U+005F、アンダースコア/アンダーバー)を言語サポート付きで使用できるようになります。 [[nodiscard]] auto f() -> int; auto g() -> std::tuple<int, double, std::string>; int main() { auto _ = f(); // ok、警告なし auto [n, _, str] = g(); // ok std::cout << _; // ng } 概要 name-independent declaration 破棄のタイミング 後方互換について 参考文献 概要 ローカル変数でその変数名が_であるものは、暗黙的に[[maybe_unused]]が指定されたように振る舞います。 [[nodiscard]] auto f() -> int; int
文書の一覧 JTC1/SC22/WG21 - Papers 2022 mailing2023-08 全部で44本あります。 もくじ N4956 Concurrency TS2 PDTS N4958 Working Draft, Programming Languages -- C++ N4959 Editors' Report, Programming Languages -- C++ N4960 Business Plan and Convener's Report: ISO/IEC JTC1/SC22/WG21 (C++) P0124R7 Linux-Kernel Memory Model P0124R8 Linux-Kernel Memory Model P0963R1 Structured binding declaration as a condition P1068R8 Vec
C++23からauto(x)の形式のキャストが可能になります。 template<std::copy_constructible T> void f(T x) { T p = auto(x); // ok、C++23から } これに関連する仕様等のメモです。 prvalue値へのキャスト 細かい仕様の話 利点や用途 decay-copyとの違い 規格書における置き換え コンセプト定義における利用例 参考文献 prvalue値へのキャスト auto(x)の形式のキャストはxをその型をdecayした型の値としてキャストするものです。 型のdecayとはその型からCV/参照修飾を取り除き、配列/関数はそのポインタに変換するものです。配列/関数以外の場合、autoによるキャストはxをその型のprvalueへキャストします。 そして、auto(x)のキャストは単なる型変換ではなく、キャスト結果のpr
文書の一覧 JTC1/SC22/WG21 - Papers 2022 mailing2023-05 全部で122本あります。 一部の記事は次の方々に手伝っていただきました、ご協力ありがとうございました! @Reputelessさん もくじ N4946 2024-03 Tokyo meeting information N4947 INCITS C++/WG21 agenda: 12-17 June 2023, Varna, Bulgaria N4948 Working Draft, C++ Extensions for Library Fundamentals, Version 3 N4949 Editor's Report: C++ Extensions for Library Fundamentals, Version 3 N4950 Working Draft, Standard f
mdspanお勉強のメモです。ここでのサンプルコードは全てkokkos/mdspanを用いて実行しています。標準のstd::mdspanに準拠して実装されているのでおそらく挙動は変わらないでしょう。 インターリーブレイアウト mdspanのカスタマイズ レイアウトポリシー型の構造 レイアウトマッピングクラスの要件 型に対する要件 メンバ型 レイアウトの特性を表す関数 基本関数 インターリーブレイアウトにおけるインデックス計算 多次元行列への一般化 実装 ストライドとlayout_stride 静的エクステントの場合の最適化 ソースコード全体 参考文献 std::mdspanそのものについてはあまり解説しないので、std::mdspanの使い方などに関しては例えばこれらの記事などをご参照ください std::mdspan - yohhoyの日記 std::mdspan - cppreferen
final specifier final指定子はC++11にてoverride指定子とともに導入されたもので、指定した関数がオーバーライドされないことを明示し、オーバーライドされた場合にコンパイルエラーを起こすものです。 また、クラスに対しても指定でき、継承できないことを表します。継承した場合はコンパイルエラーとなります。 クラスの名前の後ろ、関数の引数定義の後ろ(overrideと同じところ)に書くことが出来ます。 overrideと違ってあまり利用されていないような気がする子です・・・ 仮想関数テーブル参照のスキップ このfinal指定子ですが、指定しておくとある条件の下で最適化に利用される可能性があります。 以下のようなコードで実験してみます。 struct Base { virtual int Num() = 0; }; struct Derived1 : Base { int
C++のthrow式はどんな型のオブジェクトであっても投げることができます。この是非は置いておいて、あるthrow式に対して適切にcatch節(例外ハンドラ)が用意されている場合に、呼び出される例外ハンドラは厳密にどのように決まるのでしょうか?なんとなくthrow式の引数と同じような型ならマッチする気はしますが、そのルールは関数のオーバーロード解決時のものとは異なる気がします。 catch節での型マッチング 例外ハンドラで使えない型 例外オブジェクトの型 例外オブジェクトの状態 例外ハンドラ引数の初期化 コピー省略が起こるところ 例外オブジェクトの寿命 std::exception_ptr 例 余談 : 決して選択されない例外ハンドラ 参考文献 catch節での型マッチング 例外オブジェクトの型をEとすると、対応する例外ハンドラの決定はそのcatch節の宣言型(以下、ハンドラの型)とEをマ
constexpr if(構文としてはif constexpr)の条件にはboolに変換可能な任意の定数式を使用できます。複数の条件によって分岐させたい場合、自然に&&もしくは||によって複数の条件式をつなげることになるでしょう。そしてその場合、条件式には左から右への評価順序と短絡評価を期待するはずです。 auto func(const auto& v) { return v; // コピーされる } template<typename T> void f(T&&) { // Tが整数型かつfuncで呼び出し可能 // Tが整数型ではない場合は右辺の条件(funcの呼び出し可能性)はチェックされないことが期待される if constexpr (std::integral<T> && std::invocable<decltype(func<T>), T>) { ... } else { /
文書の一覧 JTC1/SC22/WG21 - Papers 2022 mailing2023-01 SG22のWG14からのものを除いて、全部で84本あります。 N4928 Working Draft, Standard for Programming Language C++ N4929 Editors' Report - Programming Languages - C++ N4933 WG21 November 2022 Kona Minutes of Meeting N4934 2023 WG21 admin telecon meetings N4935 2023 Varna Meeting Invitation and Information N4936 2023-11 Kona meeting information N4937 Programming Languages —
C++23から、左辺値参照を返す関数においてローカル変数を直接返すケースがコンパイルエラーとなるようになります。 int& f() { int n = 10; return n; // ng } int main() { int& r = f(); } [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ これは意図された振る舞いであるとはいえ個別の提案によって導入されたものではなく、一見関係なさそうな別の提案の副作用として導入されました。それはP2266R3 Simpler implicit moveという提案で、これはreturn文における暗黙ムーブ仕様を簡素化するものです。 暗黙ムーブ C++20時点の暗黙ムーブ仕様の概要 C++23 P2266の概要 ダングリング参照生成の抑止 この変更の意味するところ 参考文献 暗黙ムーブ 暗黙ムーブとはC++11で許可された戻り値最適化(Retu
この記事はC++ Advent Calendar 2022の14日目の記事です。 規格書中の特定領域に突如出現する謎の説明専用関数voidify()、その謎を解明するため、我々調査隊はアマゾンの奥地へと向かった――。 謎の関数voidify voidfy()の入力 voidify()の役割 voidify()の実装 反voidify()運動 参考文献 謎の関数voidify voidify()とは規格書中に登場する謎の関数で、次のように定義されています。 template<class T> constexpr void* voidify(T& ptr) noexcept { return const_cast<void*>(static_cast<const volatile void*>(addressof(ptr))); } つまりは、オブジェクトの配置されているストレージのポインタを
この記事はC++ Advent Calendar 2022の5日目の記事です。 問題です。次のコードには未定義動作が少なくとも1つ含まれています。それは何でしょう? #include <vector> #include <string> // どこかで定義されているとして auto f() -> std::vector<std::string>; int main() { for (auto&& str : f()) { std::cout << str << '\n'; } for (auto&& c : f().at(0)) { std::cout << c << ' '; } } 以下、この記事ではここのf()をたびたび再利用しますが、宣言は再掲しません。 答え なぜ? その他の例 C++23における解決 紆余曲折 参考文献 答え #include <vector> #include
文書の一覧 JTC1/SC22/WG21 - Papers 2022 mailing2022-10 全部で80本あります。 一部の記事は次の方々に手伝っていただきました、ご協力ありがとうございました! @bleaguedbさん @acd1034さん もくじ N4923 Working Draft, Extensions to C++ for Transactional Memory Version 2 P0592R5 To boldly suggest an overall plan for C++26 P0876R11 fiber_context - fibers without scheduler P0987R2 polymorphic_allocator instead of type-erasure P1061R3 Structured Bindings can introduce
この記事は規格書や提案文書から読み取れる暗黙の気持ちを前提にしている部分があり、必ずしも出典や根拠が明確でない場合があります。 std::bit_cast C++20以前の方法 reinterpret_cast union memcpy std::bit_castとmemcpyの方法 合法的type punning手法の境界 余談 制約について おわり 参考文献 std::bit_cast C++20で追加されたstd::bit_castはあるオブジェクトのバイト表現(ビット列)を維持したまま別のオブジェクトとして扱うことを可能とするライブラリ機能です。このようなことは、type punningと呼ばれます。 #include <bit> std::uint64_t punning(double v) { // double -> uint64_tのバイト表現を保った変換 return s
文書の一覧 JTC1/SC22/WG21 - Papers 2022 mailing2022-05 全部で36本あります。 N4912 2022-11 Kona hybrid meeting information N4913 PL22.16/WG21 agenda: 25 July 2022, Virtual Meeting P0543R1 Saturation arithmetic P0792R9 function_ref: a non-owning reference to a Callable P0901R9 Size feedback in operator new P1021R6 Filling holes in Class Template Argument Deduction P1255R7 A view of 0 or 1 elements: views::maybe P
C++20の<ranges>のパイプ(|)に自作のview(Rangeアダプタ)を接続できるようにするにはどうすればいいのでしょうか?その方法は一見よくわからず、特に提供されてもいません。それでもできないことはないので、なんとかする話です。 パイプの実態 Rangeアダプタオブジェクト/Rangeアダプタクロージャオブジェクト 実例 標準ライブラリ実装による実装 GCC 10 GCC 11 MSVC clang 自作viewのアダプト Rangeアダプタオブジェクトとか知らねえ!とりあえず|で繋げればいい!!っていう人向け GCC10 GCC11 MSVC clang C++23から 参考文献 パイプの実態 rangesのパイプは言語組み込みの機能ではなく、ビット論理和演算子(|)をオーバーロードしたものです。そのため、単純には|のオーバーロードを自作のviewに対して提供すれば良さそうに
クラスの静的メンバ変数は通常クラス外にその定義が必要になります。 struct sample { //宣言 static int n; }; //定義 int sample::n = 10; ただし、静的メンバ変数がstatic constexprな変数であるときは、多くの場合その定義は省略することができます(static constでもほぼ同様)。 struct sample { //宣言 static constexpr int n = 10; }; [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ しかし、static constexprな配列メンバは同様の場合においても定義が必要とされます(ただし、C++14まで)。 struct sample { //宣言? static constexpr int m[] = {10, 20}; }; //定義、これが無いとリンカエラー(C+
カルダノの公式 1. 3次の係数を1にする 2. 2次の項を削除する 3. 式の次数を落とす(2次式にして考える) 4. 得られた各値より解を求める 3次方程式の判別式 D = 0 となる場合 D > 0 となる場合 D < 0 となる場合 まとめ C++実装 参考文献 カルダノの公式 カルダノさんによる三次方程式の解の公式のことをカルダノの公式と呼びます。 まずはこれを導出してみます。以下、の形の実数係数の三次方程式の解を考えていきます。 1. 3次の係数を1にする まずは3次の項の係数を1にするように式を変形します。この操作によって解は変化しません。 3次の係数aで全体を割ってやります。残った2次以下の係数をそれぞれA,B,Cと置き、次に進みます。 2. 2次の項を削除する 次は、2次の項を削除します。式から消してしまうのです・・・。 そのために、と置換してやります。 代入し、展開し、
C言語のライブラリにたまにある、最初にグローバル状態を~init()で確保して、それを最後に~release()で解放するというインターフェースについて、C++から使うときはRAIIで自動化したい衝動に駆られます。そのとき問題となるのは、プログラムの最初で初期化したらあとはプログラム終了時まで誰にも触ってほしくない、という気持ちをどうやって実現するのか、という事です。 グローバルRAIIラッパー 型を隠そう! 初期化処理を分ける+コピー禁止 後から構築を禁止する さらなる懸念 参考文献 グローバルRAIIラッパー 単純にRAIIに従った、次のようなクラスを考えることができます。 #include <iostream> // グローバル状態初期化/解放関数とする void init() { std::cout << "init()\n"; } void release() { std::co
この記事はC++ Advent Calendar 2021の17日目の記事です。 Heterogeneous Overload? Heterogeneous Overloadというのは、(非順序)連想コンテナ(C<Key, ...>)の操作においてKeyと異なる型のオブジェクトをとることのできるオーバーロードのことです。 例えばstd::map::find()はC++14から次の2つのオーバーロードを持っています(constは無視します) iterator find(const key_type& x); // (1) template <class K> iterator find(const K& x); // (2) C++14 std::map::find - cpprefjp ここでkey_typeとはstd::map<Key, Value>のKey型であり、2つ目のオーバーロー
文書の一覧 JTC1/SC22/WG21 - Papers 2021 mailing2021-10 全部で74本あり、SG22(C/C++相互互換性に関する研究グループ)のCの提案を除くと73本になります。 採択された文書 P0798R8 Monadic operations for std::optional P1147R1 Printing volatile Pointers P1272R4 Byteswapping for fun&&nuf P2077R3 Heterogeneous erasure overloads for associative containers P2314R4 Character sets and encodings P2415R2 What is a view? P2418R2 Add support for std::generator-like ty
コンパイル時フォーマット文字列チェック basic-format-stringクラス constevalコンストラクタ 実装例 応用例 参考文献 コンパイル時フォーマット文字列チェック {fmt}ライブラリおよび<format>には、コンパイル時のフォーマット文字列チェック機能が実装されています。 #include <format> #include <fmt/core.h> int main() { // 共にコンパイルエラーを起こす auto str = std::format("{:d}", "I am not a number"); fmt::print("{:d}", "I am not a number"); } godbolt({fmt} v8.0.0のリリースノートより) {:d}は10進整数値1つのためのフォーマット指定であるのに、引数として整数値ではなく文字列が渡ってい
文書の一覧 JTC1/SC22/WG21 - Papers 2021 mailing2021-04 全部で55本あり、SG22(C/C++相互互換性に関する研究グループ)のCの提案を除くと48本になります。 P0323R10 std::expected P0447R13 Introduction of std::colony to the standard library P1121R3 Hazard Pointers: Proposed Interface and Wording for Concurrency TS 2 P1122R3 Proposed Wording for Concurrent Data Structures: Read-Copy-Update (RCU) P1132R7 out_ptr - a scalable output pointer abstraction
次のページ
このページを最初にブックマークしてみませんか?
『地面を見下ろす少年の足蹴にされる私』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く