2019-01-01から1年間の記事一覧

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

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

[翻訳]なぜそんなに確信が持てるのか?

前書き この記事はC++標準化委員会の2019年12月公開の論文の1つ、Bjarne Stroustrupさんが書かれた「P1962R0 How can you be so certain?」という論文の和訳です。 この文章はC++標準化委員会における機能追加時の議論を念頭において、C++標準化委員会メンバ…

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

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

[C++]コンセプトの文脈におけるmeet、satisfyとmodelの使い分けについて

この3つの言葉はどれも、あるコンセプトもしくは制約を満たすという意味で使われています。同じ意味のように思えますが標準ライブラリ中では明確な使い分けがなされています。 old conceptに対するmeet syntactic conceptに対するsatisfy semantic conceptに…

[C++]宇宙船演算子のフォールバック処理

宇宙船演算子の導入によって比較演算子の定義が著しく楽になります。ただ、テンプレートな所ではそう単純にはいかない事もあります。 template<typename T> struct wrap { T v; auto operator<=>(const wrap&) const = default; //Tが<=>を持っていなかったら? //Tが参</typename>…

[C++]コンセプトの5景

C++20にてついに導入されたコンセプト、書け方にムラがあるので少し整理してみます。 1. typenameの代わりに 2. 前置requires節 3. 後置requires節 ※関数のみ 4. autoによる簡略構文 ※関数のみ 5. 1と2(or 3) 4と3 全部盛り 参考文献 謝辞 1. typenameの代わ…

[C++]Deprecating volatile を見つめて

※この記事はC++20を相談しながら調べる会 #3の成果として書かれました。 C++20より、一部のvolatileの用法が非推奨化されます。提案文書は「Deprecating volatile」という壮大なタイトルなのでvolatileそのものが無くなるのかと思ってしまいますがそうではあ…

[C++]volatile修飾子についての考察

※この記事はC++20を相談しながら調べる会 #3の成果として書かれました。 P1152R4 : Deprecating volatileを読み解く過程に生じたvolatileについての調査(脱線)メモです。ほぼ文章です。 C++におけるvolatileの効果 マルチスレッドとvolatile 用途と副次的…

[C++]構造化束縛の動作モデルとラムダキャプチャ

一部のコンパイラでは構造化束縛宣言で導入された変数をラムダ式によってキャプチャすることができません。 実は、厳密に規格にのっとればC++17ならば出来ない、C++20からはできる、が正しい動作になります。 ただ、規格を眺めてもC++17でできず、C++20でき…

[C++]de Bruijn sequenceを用いたLSB/MSB位置検出テクニック

de Bruijn sequence(ド・ブラウン列) de Bruijn sequenceによるLSB位置検出 なにがおきているの? de Bruijn sequenceによる完全ハッシュ 8ビットの例 Nビット整数への一般化 64ビット数値のLSB/MSB位置を求める 参考文献 de Bruijn sequence(ド・ブラウ…

[Meson]Meson for C++の苦闘記

MesonでC++プロジェクトをクロスプラットフォームにビルドできるようにしたときのメモです。C++以外の事は分かりません・・・ 基本 コンパイラを検出する VC++プロジェクトの癖 VC++プロジェクトにヘッダを含める あるフォルダ内のファイルの列挙、ファイル…

[C++]expression-equivalentのお気持ち

expression-equivalent?? 標準ライブラリへのRangeの導入に伴って新たに追加された言葉で、次のように定義されています。 expressions that all have the same effects, either are all potentially-throwing ([except.spec]) or are all not potentially-th…

[C++]ラムダ式から関数参照への変換(単項*演算子)

状態を持たないラムダ式は単項+演算子を頭につけると明示的に対応する関数ポインタに変換することができます。では、ポインタではなく関数への参照に変換したい時はどうすれば良いのでしょうか? +をつけないだけでは関数参照にはなってくれません・・・ tem…

[C++]constinit?🤔

constinit指定子 静的変数の初期化 定数初期化(constant initialization) 定数初期化コンストラクタ 動的初期化の静的初期化への切り替え constinitの効能 利用例 const一族 参考文献 constinit指定子 constinit指定子はC++20より変数に付けることができる…

[C++]std::regexでパターンにマッチするすべての文字列を抽出する

std::regexを使う時多くの場合はstd::regex_searchを使うと思われますが、std::regex_searchはそのままだとマッチする1番最初の文字列しか得ることができません。 しかし、文字列の中からマッチする全ての要素が欲しいということはよくあることでしょう。調…

[C++]モジュール理論 上級編(魔境編)

※この記事はC++20を相談しながら調べる会 #2の成果です。 ※この内容はC++20より有効なものです。C++20正式策定までの間に内容が変化する可能性があります。 importとmoduleというキーワード プリプロセッサの扱い マクロのエクスポート 名前が可視でなければ…

[C++]モジュール理論 基礎編

※この記事はC++20を相談しながら調べる会 #2の成果です。 ※この内容はC++20より有効なものです。C++20正式策定までの間に内容が変化する可能性があります。 より読みやすい解説がすでにあるのでそちらにも目を通されるといいと思われます。→ モジュール - cp…

[C++]static constexprな配列メンバの定義

クラスの静的メンバ変数は通常クラス外にその定義が必要になります。 struct sample { //宣言 static int n; }; //定義 int sample::n = 10; ただし、静的メンバ変数がstatic constexprな変数であるときは、多くの場合その定義は省略することができます(sta…

[C++]explicit(bool)の使いどころ

※この内容はC++20から利用可能になる予定の情報であり、一部の内容が変更される可能性があります。 explicit(bool)指定子 従来コンストラクタと変換関数に付けることのできていたexplicit指定子は 、C++20よりexplicit(expr)という形のものに置き換えられま…

[C++]std::from_charsにおける先頭スペースの扱いについて

C++17で追加されたstd::from_charsはその効果の説明においてCライブラリのstrtol、strtod関数を参照し、そこにいくつか制限を加えた形で説明されています。 ところで、strtol、strtod関数は共に入力文字列の先頭にあるスペースを読み飛ばすようになっていま…

[C++]ラムダ式と単項+演算子

状態を持たない(つまり、キャプチャをしていない)ラムダ式は暗黙的に同じシグネチャの関数ポインタに変換することができます。 しかし、テンプレートパラメータの推論等のタイミングでは暗黙変換以前にラムダ式の生成する関数オブジェクトとしての型が推論…

[C++]丸かっこによる集成体初期化

※この記事はC++20を相談しながら調べる会 #1の成果です。 ※内容はC++20正式策定までに変化する可能性があります。 コンストラクタとの競合 縮小変換の許可 ネストするかっこの省略(できない!) 一時オブジェクトの寿命延長(されない!) 少し詳細な考察 D…

[C++]非型テンプレートパラメータたりうるには

※この内容はC++20より有効なものです。現行(C++17)ではまだ1ミリも利用可能な情報ではありません。また、随時記述が変更される可能性があります。 こちらの記事との関連があるので、予め目を通しておくと良いかもしれません。 onihusube.hatenablog.com 非…

[C++] constexpr関数がインスタンス化されるとき

「P0859R0 評価されない文脈でconstexpr関数が定数式評価されることを規定」を理解するためのメモです。 以下の文章内でのconstexpr関数についてのインスタンス化という言葉はテンプレートにおけるインスタンス化と同じ意味、すなわちconstexpr関数の定義の…

[C++] constexprなメモリの確保と解放のために(C++20)

※この内容はC++20から利用可能予定の情報であり、内容が変更される可能性があります。また、constexprなアロケータを作る類の内容ではないです。 前回の記事の「コンパイル時メモリアロケーション」の所に入りきらなかったP0784の内容をまとめたものです。 c…

[C++]さらに出来るようになったconstexpr(C++20)

※この内容はC++20から利用可能になる予定の情報であり、一部の変更がC++23以降に先延ばしになるなど、内容が変更される可能性があります。 C++11でconstexprが導入されて以降、あらゆる処理をconstexprで行うことを目指すかのように(おそらく実際そう)cons…

[C++]集成体の要件とその変遷

集成体(aggregate)とは配列と幾つかの条件を満たしたクラス(union含む)の事で、集成体初期化(aggregate initialization)を行えるような型のことです。一様初期化構文の導入によってその他の初期化との見た目の差異が無くなりあまり意識されなくなった…

[C++]フェラーリの方法による4次方程式の求解

フェラーリの方法 1. 4次の係数を1にする 2. 3次の項を削除する(チルンハウス変換) チルンハウス変換 3. 完全平方式に 4. 2次式へ 5. 得られた各値より解を求める 判別式 一部の係数が0になる場合の変形 複二次式 の場合 C++実装 参考文献 フェラーリの方…

[C++]void_tとその周辺

std::void_t void_tとは以下のようなエイリアステンプレートです。 な感じのメタ関数になります。 template<typename Ts...> using void_t = void; あらゆる型のベクトルを受け取りvoidへ写します。こんなもんが一体何の役に立つというのか?というと、detection idiomと呼ば</typename>…

[C++]素敵な宇宙船演算子(<=>)

※この内容はC++20より有効なものです。現行(C++17)ではまだ1ミリも利用可能な情報ではありません。また、随時記述が変更される可能性があります。 Spaceship Operator(宇宙船演算子)とは 自動生成される演算子 対称性 default実装 暗黙deleteされるケー…