yohhoyの日記

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

2017-11-01から1ヶ月間の記事一覧

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

プログラミング言語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)される。&&演算子, ||演算子では左辺の真偽値によらず全項のインスタンス化が行われ…