C++20

[C++] コンパイル時std::stringを実行時に持ち越す方法

コンパイル時動的メモリ確保の制約 コンパイル時SSO! 最大文字数 実装状況 実装について std::vectorの場合 参考文献 コンパイル時動的メモリ確保の制約 C++20でコンパイル時の動的メモリ確保が可能になり、それに伴ってstd::vectorとstd::stringが完全に定…

[C++] constexpr ifとコンセプトと短絡評価と

constexpr if(構文としてはif constexpr)の条件にはboolに変換可能な任意の定数式を使用できます。複数の条件によって分岐させたい場合、自然に&&もしくは||によって複数の条件式をつなげることになるでしょう。そしてその場合、条件式には左から右への評…

[C++]P0588R1を紐解く

C++20にひっそりと採択されているP0588R1 Simplifying implicit lambda captureという提案は、3度見したくらいでは何をしているのか、何がしたいのかさっぱりわかりません。一体これはなんなのでしょうか・・・ P0588R1のやっていること 言葉の定義 エンティ…

[C++]沼底のvoidify()

この記事はC++ Advent Calendar 2022の14日目の記事です。 規格書中の特定領域に突如出現する謎の説明専用関数voidify()、その謎を解明するため、我々調査隊はアマゾンの奥地へと向かった――。 謎の関数voidify voidfy()の入力 voidify()の役割 voidify()の実…

[C++] rangesのパイプにアダプトするには

C++20の<ranges>のパイプ(|)に自作のview(Rangeアダプタ)を接続できるようにするにはどうすればいいのでしょうか?その方法は一見よくわからず、特に提供されてもいません。それでもできないことはないので、なんとかする話です。 パイプの実態 Rangeアダプタオ</ranges>…

[C++]std::stringをキーとする(非順序)連想コンテナでHeterogeneous Overloadを有効化する

この記事はC++ Advent Calendar 2021の17日目の記事です。 Heterogeneous Overload? Heterogeneous Overloadというのは、(非順序)連想コンテナ(C<Key, ...>)の操作においてKeyと異なる型のオブジェクトをとることのできるオーバーロードのことです。 例えばstd::m</key,>…

[C++]owning_viewによるパイプライン安全性

この記事はC++ Advent Calendar 2021の7日目の記事です。 owning_view owning_viewについては、ちょうど別に書いたので以下もご参照ください。 <ranges>のviewを見る19 - owning_view - Zenn owning_viewは右辺値の範囲から構築され、それを所有することで右辺値範囲</ranges>…

[C++]`std::array`のエイリアステンプレートとCTAD

twitterに密かに置いていた質問箱に次のような質問をいただきました。 #include <array> template<auto N> using std_array_with_int = std::array<int,N>; template<typename T> using std_array_with_3 = std::array<T,3>; int main() { [[maybe_unused]] std::array ar1 = { 1, 2, 3 }; // ok [[m</t,3></typename></int,n></auto></array>…

[C++]メンバ型のトリビアル性を継承するロストテクノロジー

std::optionalやstd::variantは保持する型がトリビアルな型であれば、そのトリビアル性を継承することが規格によって求められており、その実装には非常に難解なテクニックが使用されます。しかし、C++20以降、このテクニックは過去のものとなり忘れ去られて…

[C++] std::formatあるいは{fmt}のコンパイル時フォーマット文字列チェックの魔術

コンパイル時フォーマット文字列チェック basic-format-stringクラス constevalコンストラクタ 実装例 応用例 参考文献 コンパイル時フォーマット文字列チェック {fmt}ライブラリおよび<format>には、コンパイル時のフォーマット文字列チェック機能が実装されていま</format>…

[C++]WG21月次提案文書を眺める(2021年05月)

文書の一覧 JTC1/SC22/WG21 - Papers 2021 mailing2021-05 全部で44本あり、SG22(C/C++相互互換性に関する研究グループ)のCの提案を除くと36本になります。 P0009R11 MDSPAN P0009R12 MDSPAN P0447R14 Introduction of std::colony to the standard librar…

[C++]C++20モジュールの変遷 - Module TSからC++20DISまで

C++20のモジュールは確かにある一つの提案がベースになっているのですが、その後C++20策定完了までの間に複数の提案やIssue報告によってそこそこ大きく変化しています。その結果、C++20のモジュールはその全体像を把握するためにどれか一つの提案を読めばわ…

[C++]TU-local Entityをexposureするのこと(禁止)

モジュールと内部リンケージ名 例 TU-local Entities? TU-local Entityの曝露(exposure) TU-local Entityを曝露してたら・・・ テンプレート 明示的インスタンス化 メンバ関数の暗黙inline さんぷるこーど モジュールにおけるinlineの意味 モジュールリン…

[C++]indirectly_writableコンセプトの謎の制約式の謎

std::indirectly_writableコンセプトはイテレータによる出力操作を定義するコンセプトで、std::output_iteratorコンセプトの中核部分を成しています。 template<class Out, class T> concept indirectly_writable = requires(Out&& o, T&& t) { *o = std::forward<T>(t); *std::forw</t></class>…

[C++]推論補助(deduction guide)にexportはいるの?

A : いりません 根拠 モジュールにおけるexport宣言は、そのモジュールのインターフェース単位でのみ行うことができます。export宣言は名前を導入するタイプの宣言の前にexportを付けることで行い、その名前に外部リンケージを与える以外は元の宣言と同じ効…

[C++] C++17イテレータ <=> C++20イテレータ != 0

これはC++ Advent Calendar 2020の24日めの記事です(大遅刻です、すいません)。 前回と前々回でC++20のイテレータは一味も二味も違うぜ!という事を語ったわけですが、具体的にどう違うのかを見てみようと思います。 iterator C++17 C++20 差異 input iter…

[C++]C++20からのiterator_traits事情

これはC++ Advent Calendar 2020の14日めの記事です。 C++20のiterator_traitsには、C++17以前のコードに対する互換レイヤとしての複雑な役割が与えられるようになります。従って、C++20からのイテレータ情報の問い合わせには前回説明したものを利用するよう…

[C++] C++20からのイテレータの素行調査方法

これはC++ Advent Calendar 2020の11日めの記事です。 これまでiterator_traitsを介して取得していたイテレータ情報は、C++20からはより簡易な手段を介して取得できるようになります。 特に、C++20以降はiterator_traitsを使わずにこれらのものを利用するこ…

[C++]inline名前空間の使途

inline名前空間はC++11から追加された機能で、その中にあるものは透過的に(名前空間がないかのように)アクセスすることができます。一見使いどころがなく見られがちですが、うまく使えばとても便利に活用することができます。 1. using namespaceの範囲を…

[C++]モジュールにおける所有権モデル

モジュールにおける所有権とは、名前付きモジュールに属しているエンティティの名前に関する所有権の事で、次のようなコードがどう振舞うかを決定するものです。 /// moduleA.ixx export module moduleA; export int munge(int a, int b) { return a + b; } …

[C++]Forwarding referenceとコンセプト定義

コンセプトを定義するとき、あるいはrequires節で制約式を書くとき、はたまたrequires式でローカルパラメータを使用するとき、その型パラメータがForwarding referenceから来ているものだと使用する際に少し迷う事があります。 // operator*による間接参照が…

[C++]カスタマイゼーションポイントオブジェクト(CPO)概論

C++20以降の必須教養となるであろうカスタマイゼーションポイントオブジェクトですが、その利便性の高さとは裏腹に理解が難しいものでもあります。これはその理解の一助となるべく私の頭の中の理解を書き出したメモ帳です。 C++17までのカスタマイゼーション…

[C++]モジュールとプリプロセス

C++20より使用可能になるはずのモジュールは3つの新しいキーワードを用いて記述されますが、それらのキーワードは必ずしも予約語ではなく、コンパイラによる涙ぐましい努力によって特殊な扱われ方をしています。 ディレクティブ導入トークン モジュールディ…

[C++]コンソール出力にchar8_t文字列を出力したい!

非Windows Windowsのコンソール出力と標準出力 標準IOストリームのモード コンソールのコードページ スクリーンバッファ 1. 素直に変換してstd::coutする 1.2 UTF-16に変換してstd::wcoutする 2. UTF-16に変換してWriteConsoleW()する 3. 標準出力をユニコー…

[C++]コンセプトの無言のお願い事

等しさの保持(equality preservation) 安定(stable) 定義域(domain) 制約式の引数に対しての制約 requires式とrequires節 暗黙的な式のバリエーション(implicit expression variations) コンセプトのモデルとなるために 参考文献 謝辞 等しさの保持…

[C++]std::common_referenceの概念

C++20より追加されたstd::common_reference<T, U>は型T, U両方から変換可能な共通の参照型を求めるメタ関数です。ただしその結果型は必ずしも参照型ではなかったりします。std::common_typeとの差など、存在理由がよく分からない物でもあります・・・ 同じ事を思う</t,>…

[C++]モジュールインポート時の動的初期化順序

ほぼほぼ、2019年12月のBelfast会議で採択されたP1874R1 Dynamic Initialization Order of Non-Local Variables in Modulesの和訳しただけです。 モジュールについては以前の記事でもご参照ください。 onihusube.hatenablog.com P1874R1前夜の大問題 P1874R1…

[C++] 集成体のテンプレート引数推論

C++17のテンプレートな集成体とテンプレートパラメータ推論 C++17から、クラステンプレートのコンストラクタ引数からそのテンプレート引数を推論出来るようになりました。これによって、クラステンプレートを扱う際にとても便利に書けます。 // std::vector<int> </int>…

[C++] std::rangesの範囲アクセス関数(オブジェクト)の使いみち

C++20のRangeライブラリ導入に伴って、std::ranges名前空間の下にbegin,end,size,data等の、これまでコンテナアクセスに用いられていた関数が追加されています。しかし、これらの関数はすでにstd名前空間に存在しており、一見すると同じ役割を持つものが重複…

[C++] [[nodiscard]]の言いたいこと

関数の戻り値に対するnodiscard 一番基本的な使い方です。この場合は単に戻り値を捨てないでね?という意思表示をし、それをコンパイラに通知してもらいます、そのままです。 [[nodiscard]] int f() { return 0; } int main() { f(); //コンパイラが警告を出…