yohhoyの日記

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

C++1z

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

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

文字列リテラルからの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)される。&&演算子, ||演算子では左辺の真偽値によらず全項のインスタンス化が行われ…

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

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

std::launder関数

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

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

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

std::byte型あれこれ

C++1z(C++17)で導入されるstd::byte型に関するメモ。コンパイル時型検査による安全性向上を目的として、「バイト(byte)」を表す標準データ型として導入される。C++標準ライブラリの拡張だけではなく、C++言語仕様にも特別扱いが追加される。 // 標準ヘッダ<cstddef> n</cstddef>…

C標準ヘッダ in 未来のC++

プログラミング言語C++標準規格におけるC標準ヘッダ(<stdlib.h> や <stdio.h> など)の扱いについて。2021-10-27追記:C++2b(C++23)に向けた提案 P2340R1 が採択され、全てのC標準ヘッダについて廃止予定が取り止められた。例えば<iso646.h>ヘッダは空っぽ、<complex.h>ヘッダは#include <complex>と規定され</complex></complex.h></iso646.h></stdio.h></stdlib.h>…

i = i++ + 1;の評価順規定

プログラミング言語C++における評価順規定の変遷についてメモ*1。本記事では代入+前置/後置インクリメント*2+加算演算子*3 *4を扱う。注意:本記事は言語仕様の隅をつつく話題であり、一般論として同一オブジェクトに対する複数回の副作用を伴う式文は避…

shared_ptr参照カウントとデータ競合

C++1z(C++17)標準ライブラリでは、スマートポインタstd::shared_ptr<T>のuniqueメンバ関数は非推奨(deprecated)とされる*1。上位互換となるuse_countメンバ関数は残存するが、スレッド間同期には関与しないという要件が明確化され、マルチスレッド実行ではその</t>…

range-based forと文字走査

C++11で導入された range-based for 構文を用いて、文字列を一文字づつ走査する方法。*1 文字列リテラル 文字列リテラルはconst char配列型(→id:yohhoy:20150213)であるため、range-based for 構文による要素走査が可能。ただし文字列リテラル末尾に自動追…

多値返却×型推論 in C++ (2)

C++1z(C++17)で導入予定の Structured Bindings と クラステンプレートの型推論 を組み合わせて、多値返却関数からの戻り値を型推論された個別変数にて受け取る方法。こちらは多値返却関数fooの戻り値を型推論する前提。 // C++1z(C++17) #include <cassert> #include <string></string></cassert>…

多値返却×型推論 in C++ (1)

C++1z(C++17)で導入予定の Structured Bindings*1 とstd::tupleコンストラクタの改善(→id:yohhoy:20150416)を組み合わせて、多値返却関数からの戻り値を型推論された個別変数にて受け取る方法。 // C++1z(C++17) #include <cassert> #include <string> #include <tuple> #include <type_traits> </type_traits></tuple></string></cassert>…

std::arrayの(ほぼ)constexprネイティブ対応

C++1z(C++17)標準ライブラリのシーケンスコンテナstd::array<T,N>では、ほぼ全てのメンバ関数*1がconstexpr指定される。あわせて、関連するイテレータ型やbegin/end関数群*2へもconstexpr指定が追加される。2019-09-11追記:C++2a(C++20)に向けて (PDF)P1023R0、P</t,n>…

文字列取得バッファとしてのstd::string リターンズ

C++1z(C++17)標準ライブラリの文字列型std::basic_string<charT>クラステンプレートでは、ポインタ型charT*を返す 非const版 dataメンバ関数が追加される。(ポインタ型const charT*を返すconst版dataメンバ関数はC++98から存在している。)まとめ: C++98/03標準ラ</chart>…

std::clamp

C++1z(C++17)標準ライブラリでは、指定区間内に値を制限するstd::clamp関数テンプレートが追加される。*1 #include <algorithm> int b = std::clamp(3, 1, 6); // 3 int a = std::clamp(0, 1, 6); // 1(下限値) int c = std::clamp(8, 1, 6); // 6(上限値) 同様の関数テ</algorithm>…

Detection Idiom

C++1z(C++17)標準ヘッダ<type_traits>に追加されるstd::void_tクラステンプレートを用いたイディオム。クラスメンバの存在検知や、型に対して特定の式が有効なことを検知できる。 // C++1z: 型Tがメンバtypeを持つか? template <class, class = std::void_t<>> struct has_type_member : std::false_ty</class,></type_traits>…

std::functionの戻り値型に関する小修正

C++1z(C++17)で修正される、std::functionクラステンプレートが扱う関数戻り値型にまつわる小さな問題。 // ラムダはintを返すがfunctionオブジェクトは戻り値型voidを扱う std::function<void()> f = [](){ return 42; }; // C++11/14: 未定義動作(undefined behavi</void()>…

Perfect Initializationイディオム

型Tを値保持するクラステンプレートにおいて(pair, tupleなど)、型Tコンストラクタの explicit 性を継承するイディオム。「ある型Uからの暗黙型変換を許可するか否か」という性質を、型Tをラップするクラステンプレートへと引き継ぐ。2018-06-09追記:C++2…

関数パラメータ型としてのauto?

gcc(g++) 4.9.0以降/gnu++1zモードでは、関数パラメータ型として auto キーワードを利用できる。これはC++1zに向けて提案されているConcepts Lite拡張の一部。2019-01-11追記:C++2a(C++20)言語仕様に向けて、abbreviated function template 構文を含むP114…

INVOKE仮想操作の参照実装

C++11で定義される INVOKE 仮想操作の参照実装。C++1z(C++17)に向けてN4169でC++標準ライブラリ入りを提案中。2016-07-28追記:C++1z(C++17)標準ライブラリへのstd::invoke関数テンプレート追加が採択された。2019-09-14追記:C++2a(C++20)標準ライブラリで…

synchronic同期プリミティブ

C++1z(C++17)に向けて提案されている同期プリミティブについてメモ。(PDF)N4195 std::synchronic<T> に基づく。初期提案のため概要のみ。2019-09-12追記:C++2a(C++20)に向けて提案文書 P1135R6 が採択され、atomic変数std::atomic<T>に wait / notify_one / notif</t></t>…