yohhoyの日記

技術的メモをしていきたい日記

C++

名無しの変数

C++

プログラミング言語C++には、言語仕様の定義上 “名前のない変数(variable)” が存在する。誰得情報。 try { } catch (std::exception&) { // ★ } C++14 3/p6より引用(下線部は強調)。C++17では6/p6。 A variable is introduced by the declaration of a ref…

Is volatile useful with threads?

volatileキーワードはマルチスレッド処理に役立つ?.com(http://isvolatileusefulwiththreads.com/) C http://c.isvolatileusefulwiththreads.com/ C++ http://cxx.isvolatileusefulwiththreads.com/ Java http://java.isvolatileusefulwiththreads.com/ C…

条件付きexplicit指定子

C++2a(C++20)言語仕様では 条件付きexplicit指定子 が追加され、pairやtupleなどの型Tを値保持するクラステンプレートにおいて、型Tコンストラクタ実装時のexplicit性継承(→id:yohhoy:20150416)が容易になる。 // C++17仕様 template <typename T1, typename T2> struct pair { // no</typename>…

配列有効範囲外を指すポインタ値は存在が許されない

C C++

プログラミング言語C/C++における、配列型とポインタ演算の知られざる*1落とし穴。問題:下記sum_odd関数の実行結果は? int data[5] = { 1, 2, 3, 4, 5 }; // 奇数番目の要素値のみを合計する int sum_odd() { int s = 0; int *endp = data + 5; // 配列末…

C++コルーチン拡張メモ(N4736)

プログラミング言語C++のコルーチン(Coroutines)拡張に関するメモ。2018年4月現在、C++2a(C++20)標準規格での正式採択に向けた検討が進んでいる。2019-08-09追記:2019年2月会合にてP0912R5が採択され、C++2aへのコルーチン導入が決定している。id:yohhoy:20…

遅延機構付きデータキュー

C++

スレッドセーフ・遅延機構付き・上限なし・データキューのC++実装*1。Java標準ライブラリ java.util.concurrent.DelayQueue に相当。通常のデータキューと異なり、キューへの要素追加時に “有効時刻” を指定する。該当要素はその有効時刻を過ぎるまではキュ…

C++標準ライブラリのタイムゾーン(Time Zone)

C++2a(C++20)標準ライブラリ <chrono> ヘッダに追加される タイムゾーン(Time Zone) サポートについてざっくりメモ。本記事では簡単のため名前空間std::chronoを省略する。カレンダー(Calendar)については C++標準ライブラリのカレンダー(Calendar) 参照。まとめ: </chrono>…

C++標準ライブラリのカレンダー(Calendar)

C++2a(C++20)標準ライブラリ <chrono> ヘッダに追加される カレンダー(Calendar) サポートについてざっくりメモ。本記事では簡単のため名前空間std::chronoを省略する。またタイムゾーン(Time Zone)サポートには言及しない。まとめ: 型安全(Type safety): 年(year)</chrono>…

C++標準ライブラリの時計(Clock)

C++2a(C++20)標準ライブラリ <chrono> ヘッダに追加される 時計(Clock) クラス一覧。いずれもstd::chrono名前空間に属する。 Clock 概要 基点(epoch) うるう秒 system_clock システムクロック[C++11] 1970-01-01 00:00:00 UTC 除外 utc_clock 協定世界時(UTC)クロ</chrono>…

C++ミューテックス・コレクション -みゅーこれ-

C++

長いのでこちら→ C++ミューテックス・コレクション -みゅーこれ- 紹介編 - yohhoyの日記(別館) C++ミューテックス・コレクション -みゅーこれ- 実装編 - yohhoyの日記(別館) コード:https://github.com/yohhoy/yamc

ストリーム入出力と評価順規定の厳格化

C++

プログラミング言語C++における評価順規定の変遷についてメモ。本記事ではストリーム挿入(出力)演算子<<のみを扱うが、ストリーム抽出(入力)演算子>>にも同様に適用される。クイズ:下記プログラムを実行すると何が出力されるか? #include <iostream> int main() { in</iostream>…

関数引数リスト評価順規定の厳格化

C++

プログラミング言語C++における評価順規定の変遷についてメモ。本記事では関数呼び出しにおける実引数リストを扱う。超要約:C++17では、プログラマが期待する振る舞いに近づく(※)よう言語仕様が調整された。[※おそらく期待するほどではない]。こまけぇこ…

広い契約(Wide Contracts)とnoexcept指定

C++

プログラミング言語C++のライブラリ設計における、関数へのnoexcept指定と外部仕様の関係についてメモ。2021-07-07追記:本記事が説明するC++標準ライブラリの設計ガイドラインは、当時の提案者名から "The Lakos Rule" と呼ぶらしい。記事 The Lakos Rule …

参照型変数とメモリの関係

プログラミング言語C++の言語仕様では、メモリ空間上に 参照型(reference type) の実体が存在するか否かを規定しない(unspecified)。 スカラ型(scalar type)=算術型/列挙型/ポインタ型やその配列型などのオブジェクト(object)は、メモリ空間上に実体が配…

C++ Synchronized Buffered Ostream

C++2a(C++20)に向けて(PDF)P0053R6が採択され、マルチスレッド環境下でのストリーム出力排他制御をサポートする同期化出力ストリームstd::osyncstreamが追加される。 // C++2a(C++20) #include <syncstream> #include <iostream> void thread1(int value) { // 下記行の処理結果が</iostream></syncstream>…

dataメンバ関数:std::string vs. std::string_view

C++1z(C++17)標準ライブラリ文字列std::stringと文字列ビューstd::string_viewにおいて、dataメンバ関数が返すメモリ領域とヌル終端文字列の関係についてメモ。まとめ: stringに “非const版”dataメンバ関数 が追加され、変更可能なヌル終端文字列を返す。(…

文字列リテラルとヌル終端文字列とで関数オーバーロード

C++

プログラミング言語C++の文字列リテラル/ヌル終端文字列に対して、配列参照型をとる関数テンプレートf(const char(&)[N])とポインタ型をとる関数f(const char*)のオーバーロードは、プログラマの期待通りには振る舞わない。本記事の内容はStack Overflowで…

文字列リテラルからのstd::string_view構築

C++1z(C++17)において文字列リテラルから文字列ビューstd::string_viewへ変換する場合、暗黙の型変換ではなくユーザ定義リテラル""svの明示利用が望ましい。 string_viewクラスはC文字列(const char*)からの非explicit変換コンストラクタを提供する。 string…

std::string_viewでは値渡しを利用する

C++1z(C++17)標準ライブラリ提供のstd::string_view*1 を関数パラメータ型で利用する場合、原則として値渡し(pass-by-value)スタイルとすること。C++14以前でconst string&としていた関数パラメータ型は、ほとんどのケースでstring_viewへと単純置換できる。…

真偽値を返すメタ関数利用上の注意

C++標準ライブラリ <type_traits> ヘッダ提供の真偽値を返すメタ関数において、is_xxx<T>{}のような真偽値変換(→id:yohhoy:20121207)は適切でないケースがある。素直にis_xxx<T>::valueで真偽値を取り出すか、C++1z(C++17)で追加される変数テンプレート版メタ関数is_xxx_v<T>の利</t></t></t></type_traits>…

conjunction/disjunctionと短絡インスタンス化

C++1z(C++17)標準ライブラリで追加されるstd::conjunction, std::disjunctionメタ関数では、型特性(type traits)のテンプレートインスタンス化が短絡評価(short-circuiting)される。&&演算子, ||演算子では左辺の真偽値によらず全項のインスタンス化が行われ…

default指定でdeletedされるムーブ操作とオーバーロード解決

プログラミング言語C++において、“default指定でdeletedされるムーブコンストラクタ/代入演算子(→id:yohhoy:20130203)” はオーバーロード解決に影響しない。これはCWG DR 1402で修正された挙動。 struct X { const int i = 42; // constデータメンバを含…

シーケンスコンテナ×イテレータ・ペア×リスト初期化×推論ガイド=?

C++1z(C++17)標準ライブラリのシーケンスコンテナ(std::vectorなど)にはクラステンプレート引数推論 推論ガイド(deduction guide) が追加されたが、イテレータ・ペアによるリスト初期化(list initialization)では意図しない型推論が行われる。かなり罠っぽい…

C++ Concepts(P0734R0)

次期C++2a(C++20)標準規格に向けて採択された コンセプト(concept) についてメモ。*1本記事の内容は(PDF)P0734R0 Wording Paper, C++ extensions for Conceptsに基づく。要約: 新しいキーワード:concept, requires 新しい構文:コンセプト定義, requires式…

Designated Initialization @ C++

C++2a(C++20)で導入予定のDesignated Initialization(指示付きの初期化)ついてメモ。C99での同一言語機能をベースとするが、一部機能制限された形でC++に導入される。 // C++2a(C++20) struct Point { int x, y; }; void f(Point); f({ .x = 100, .y = 50 …

std::launder関数

C++1z(C++17)標準ライブラリに追加されるstd::launder関数テンプレートについて。メモリ・ロンダリング関数。*1まとめ: オブジェクト生存期間(lifetime)に基づいた最適化の抑止をコンパイラに伝える関数。プログラマ視点では “何もしない関数” にみえる。*2…

関数テンプレートでの可変長引数テンプレート明示特殊化の複雑な関係

C++

プログラミング言語C++において、可変長引数テンプレートのテンプレート・パラメータパック(template parameter pack)は、関数テンプレートに対する明示的なテンプレート実引数指定では完全に特殊化できない(パターンがある)。本記事の内容はStack Overflo…

fallthrough属性利用時のちょっとした注意点

C++1z(C++17)で追加される fallthrough属性 の利用に関する注意点について。下記コードの★部ではフォールスルー(fallthrough)明示を意図しているが、C++コンパイラはプログラマの期待通り振舞わない。これは末尾セミコロン(;)を忘れたことで、fallthrough属…

std::stringとリスト初期化の小さな罠

C++

C++標準ライブラリの文字列型std::stringと、リスト初期化(list initialization)の組み合わせによる落とし穴。2個の文字列リテラルによるstd::stringのリスト初期化は、ほとんどのC++処理系においてコンパイル時には問題検知されないが*1、実行時に未定義動…

条件演算子と親クラスへの型推論(C++編)

C++

プログラミング言語C++における条件演算子(conditional operator) ?: と、子クラスから親クラスへの型推論に関してメモ。条件演算子の第2, 3項目に親クラスParentから派生した子クラスChild1, Child2を指定した場合、C++では型推論に失敗してコンパイルエラ…