C++20
constexpr if(構文としてはif constexpr)の条件にはboolに変換可能な任意の定数式を使用できます。複数の条件によって分岐させたい場合、自然に&&もしくは||によって複数の条件式をつなげることになるでしょう。そしてその場合、条件式には左から右への評…
C++20にひっそりと採択されているP0588R1 Simplifying implicit lambda captureという提案は、3度見したくらいでは何をしているのか、何がしたいのかさっぱりわかりません。一体これはなんなのでしょうか・・・ P0588R1のやっていること 言葉の定義 エンティ…
この記事はC++ Advent Calendar 2022の14日目の記事です。 規格書中の特定領域に突如出現する謎の説明専用関数voidify()、その謎を解明するため、我々調査隊はアマゾンの奥地へと向かった――。 謎の関数voidify voidfy()の入力 voidify()の役割 voidify()の実…
C++20の<ranges>のパイプ(|)に自作のview(Rangeアダプタ)を接続できるようにするにはどうすればいいのでしょうか?その方法は一見よくわからず、特に提供されてもいません。それでもできないことはないので、なんとかする話です。 パイプの実態 Rangeアダプタオ</ranges>…
この記事はC++ Advent Calendar 2021の17日目の記事です。 Heterogeneous Overload? Heterogeneous Overloadというのは、(非順序)連想コンテナ(C<Key, ...>)の操作においてKeyと異なる型のオブジェクトをとることのできるオーバーロードのことです。 例えばstd::m</key,>…
この記事はC++ Advent Calendar 2021の7日目の記事です。 owning_view owning_viewについては、ちょうど別に書いたので以下もご参照ください。 <ranges>のviewを見る19 - owning_view - Zenn owning_viewは右辺値の範囲から構築され、それを所有することで右辺値範囲</ranges>…
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>…
std::optionalやstd::variantは保持する型がトリビアルな型であれば、そのトリビアル性を継承することが規格によって求められており、その実装には非常に難解なテクニックが使用されます。しかし、C++20以降、このテクニックは過去のものとなり忘れ去られて…
コンパイル時フォーマット文字列チェック basic-format-stringクラス constevalコンストラクタ 実装例 応用例 参考文献 コンパイル時フォーマット文字列チェック {fmt}ライブラリおよび<format>には、コンパイル時のフォーマット文字列チェック機能が実装されていま</format>…
文書の一覧 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++20のモジュールは確かにある一つの提案がベースになっているのですが、その後C++20策定完了までの間に複数の提案やIssue報告によってそこそこ大きく変化しています。その結果、C++20のモジュールはその全体像を把握するためにどれか一つの提案を読めばわ…
モジュールと内部リンケージ名 例 TU-local Entities? TU-local Entityの曝露(exposure) TU-local Entityを曝露してたら・・・ テンプレート 明示的インスタンス化 メンバ関数の暗黙inline さんぷるこーど モジュールにおけるinlineの意味 モジュールリン…
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>…
A : いりません 根拠 モジュールにおけるexport宣言は、そのモジュールのインターフェース単位でのみ行うことができます。export宣言は名前を導入するタイプの宣言の前にexportを付けることで行い、その名前に外部リンケージを与える以外は元の宣言と同じ効…
これはC++ Advent Calendar 2020の24日めの記事です(大遅刻です、すいません)。 前回と前々回でC++20のイテレータは一味も二味も違うぜ!という事を語ったわけですが、具体的にどう違うのかを見てみようと思います。 iterator C++17 C++20 差異 input iter…
これはC++ Advent Calendar 2020の14日めの記事です。 C++20のiterator_traitsには、C++17以前のコードに対する互換レイヤとしての複雑な役割が与えられるようになります。従って、C++20からのイテレータ情報の問い合わせには前回説明したものを利用するよう…
これはC++ Advent Calendar 2020の11日めの記事です。 これまでiterator_traitsを介して取得していたイテレータ情報は、C++20からはより簡易な手段を介して取得できるようになります。 特に、C++20以降はiterator_traitsを使わずにこれらのものを利用するこ…
inline名前空間はC++11から追加された機能で、その中にあるものは透過的に(名前空間がないかのように)アクセスすることができます。一見使いどころがなく見られがちですが、うまく使えばとても便利に活用することができます。 1. using namespaceの範囲を…
モジュールにおける所有権とは、名前付きモジュールに属しているエンティティの名前に関する所有権の事で、次のようなコードがどう振舞うかを決定するものです。 /// moduleA.ixx export module moduleA; export int munge(int a, int b) { return a + b; } …
コンセプトを定義するとき、あるいはrequires節で制約式を書くとき、はたまたrequires式でローカルパラメータを使用するとき、その型パラメータがForwarding referenceから来ているものだと使用する際に少し迷う事があります。 // operator*による間接参照が…
C++20以降の必須教養となるであろうカスタマイゼーションポイントオブジェクトですが、その利便性の高さとは裏腹に理解が難しいものでもあります。これはその理解の一助となるべく私の頭の中の理解を書き出したメモ帳です。 C++17までのカスタマイゼーション…
C++20より使用可能になるはずのモジュールは3つの新しいキーワードを用いて記述されますが、それらのキーワードは必ずしも予約語ではなく、コンパイラによる涙ぐましい努力によって特殊な扱われ方をしています。 ディレクティブ導入トークン モジュールディ…
非Windows Windowsのコンソール出力と標準出力 標準IOストリームのモード コンソールのコードページ スクリーンバッファ 1. 素直に変換してstd::coutする 1.2 UTF-16に変換してstd::wcoutする 2. UTF-16に変換してWriteConsoleW()する 3. 標準出力をユニコー…
等しさの保持(equality preservation) 安定(stable) 定義域(domain) 制約式の引数に対しての制約 requires式とrequires節 暗黙的な式のバリエーション(implicit expression variations) コンセプトのモデルとなるために 参考文献 謝辞 等しさの保持…
C++20より追加されたstd::common_reference<T, U>は型T, U両方から変換可能な共通の参照型を求めるメタ関数です。ただしその結果型は必ずしも参照型ではなかったりします。std::common_typeとの差など、存在理由がよく分からない物でもあります・・・ 同じ事を思う</t,>…
ほぼほぼ、2019年12月のBelfast会議で採択されたP1874R1 Dynamic Initialization Order of Non-Local Variables in Modulesの和訳しただけです。 モジュールについては以前の記事でもご参照ください。 onihusube.hatenablog.com P1874R1前夜の大問題 P1874R1…
C++17のテンプレートな集成体とテンプレートパラメータ推論 C++17から、クラステンプレートのコンストラクタ引数からそのテンプレート引数を推論出来るようになりました。これによって、クラステンプレートを扱う際にとても便利に書けます。 // std::vector<int> </int>…
C++20のRangeライブラリ導入に伴って、std::ranges名前空間の下にbegin,end,size,data等の、これまでコンテナアクセスに用いられていた関数が追加されています。しかし、これらの関数はすでにstd名前空間に存在しており、一見すると同じ役割を持つものが重複…
関数の戻り値に対するnodiscard 一番基本的な使い方です。この場合は単に戻り値を捨てないでね?という意思表示をし、それをコンパイラに通知してもらいます、そのままです。 [[nodiscard]] int f() { return 0; } int main() { f(); //コンパイラが警告を出…
この3つの言葉はどれも、あるコンセプトもしくは制約を満たすという意味で使われています。同じ意味のように思えますが標準ライブラリ中では明確な使い分けがなされています。 old conceptに対するmeet syntactic conceptに対するsatisfy semantic conceptに…