C++
並行プログラミングでのアトミック操作をする上で、処理の順序保証をする仕組みとしてメモリオーダーがあります。C++の標準ライブラリではメモリオーダーが何種類か提供されていますが、C++1zではmemory_order_consumeというメモリオーダーが一時的に非推奨…
C++11で導入されたstd::functionクラスには、アロケータを受け取るコンストラクタとassign()メンバ関数がありました。しかし、その仕様が不明確であったことから、正しい実装が行われてきませんでした。 GCCの標準ライブラリ実装であるlibstdc++では、アロケ…
C++1zから、標準ライブラリのいくつかの機能が非推奨となります。非推奨となった機能は将来のバージョンで削除される可能性がありますのでご注意ください。 std::iteratorクラス 自作イテレータを作るときに基本クラスとして使用するstd::iteratorクラスです…
C++1zから、イテレータの分類に「隣接イテレータ (contiguous iterator)」というものが追加されます。 ランダムアクセスイテレータだけではポインタ操作ができるかわからないので、メモリが隣接していることを表すイテレータの分類を追加することになりまし…
C++1zでは、非推奨(deprecated)になっていた以下の機能が削除されます。既存のコードでこれらの関数を使用していた場合、コンパイルが通らなくなりますのでご注意ください。 古いスマートポインタ std::auto_ptrクラス C++11から非推奨。 代わりにstd::share…
C++11から入ったstd::mem_fn()関数、std::bind()関数、std::result_ofメタ関数などは、どれもINVOKEコンセプトという仕様のもとに定義されています。 これらの機能は、関数オブジェクトをただ呼び出すだけでなく、 メンバ関数ポインタ + レシーバー + 引数を…
C++14まで、以下のコードは不適格(コンパイルエラー)でした: unique_ptr<Foo const * const []> ptr1(new Foo*[10]); Foo const * ptr = ptr1[9]; C++1zでは、このような型変換を許可するために、unique_ptrの配列に対する特殊化バージョンに、変換コンストラクタや変換代入演算子</foo>…
C++1zから、SFINAEによる「型に対して特性の操作ができるか」を判定するメタ関数の定義を容易にするために、void_tというパラメータで任意の数の型を受け取ってなにもせずvoidを返す型が定義されます。 // <type_traits> namespace std { template <class...> using void_t = void; </class...></type_traits>…
C++14までコンテナのnoexceptは最小限でしたが、C++1zではアロケータのコピーやムーブが例外を投げる可能性があるかどうかに基づいて、noexceptが追加されます。これで、標準ライブラリを使用したプログラムがより強い例外安全性を保証できるようになります。…
C++1zでは、以下の機能にconstexprが付きます。 <iterator> std::advance()関数 std::distance()関数 std::next()関数 std::prev()関数 std::reverse_iteratorクラスのメンバ関数、非メンバ関数すべて std::move_iteratorクラスのメンバ関数、非メンバ関数すべて コン</iterator>…
この機能はC++1z入りが取り消されました。 mapやsetのキーとなる型はデフォルトで、operator<で比較できる必要があります。連想コンテナのキーにできるようにするために、ユーザー定義型にoperator<を定義することもありますが、その比較演算を連想コンテナ…
C++1zでは、2つの連想コンテナを接合(splice)する機能が入ります。対象は、map、set、unordered_map、unordered_setとそれらのmulti版すべてです。 まず、特定の要素を抽出する機能として、extract()メンバ関数が追加されます。 node_type extract(const_ite…
一意なキーを持つstd::mapとstd::unordered_mapに対して、2種類のメンバ関数が追加されます。対象には、std::multimapやstd::unordered_multimapおよび集合コンテナは含みません。 try_emplace()メンバ関数 : 挿入失敗時に、与えられたパラメータargs...を変…
C++1zから、低レイヤーの文字列・数値間の変換関数が導入されます。これは、ハイパフォーマンスな文字列処理をするための基礎を提供することを目的としています。 数値から文字列への変換はto_chars()、文字列から数値への変換はfrom_chars()という関数です…
C++1zから、2つの値の最大公約数(Greatest common divisor)を求めるgcd()関数と、最小公倍数(Least common multiple)を求めるlcm()関数が導入されます。 これらの関数は、<cmath>ではなく数値計算用のC++ヘッダ<numeric>で定義されます。bool以外の整数型ならなんでも扱えま</numeric></cmath>…
タプルを展開して関数呼び出しするapply()関数の導入に合わせて、タプルを任意の型に変換するmake_from_tuple()関数が導入されます。 apply()関数ではオブジェクトの構築までカバーができない(コンストラクタを呼び出せない)ので、そのコーナーケースをカバ…
C++1zから、タプルを引数列に変換して関数適用するapply()関数が入ります。これは、C++14で追加されたコンパイル時整数シーケンスを使用した最初の標準ライブラリ実装になります。 #include <iostream> #include <tuple> #include <string> void f(int a, double b, std::string c) { </string></tuple></iostream>…
C++1zでは<algorithm>ヘッダに、範囲の中から指定された個数の要素をランダムに抽出するsample()アルゴリズムが定義されます。 #include <iostream> #include <string> #include <iterator> #include <random> #include <algorithm> int main() { const std::string input = "abcdef"; // inputから3要素を無作為抽出す</algorithm></random></iterator></string></iostream></algorithm>…
C++1zでは、文字列内の文字列を高速に検索するためのアルゴリズムとして、「ボイヤー・ムーア法 (Boyer-Moore)」と「ボイヤー・ムーア・ホースプール法 (Boyer-Moore-Horspool)」が導入されます。 これは、既存のstd::search()アルゴリズムを拡張する形で行…
C++1zから、アロケートする型を規定しないアロケータと、それを利用したメモリプールの仕組みが導入されます。 std::allocator<T>クラスは型Tのオブジェクトをアロケートする機能を提供しますが、アロケートする型ごとにアロケータオブジェクトが必要になり、メ</t>…
C++1zでは、所有権を持たない文字列クラスとして、basic_string_viewクラスが導入されます。その別名として、char文字配列を扱うstring_view、char32_t文字配列を扱うu32string_viewなどが定義されます。 このクラスは、文字列リテラルような文字配列に対し…
C++1zから、型安全な共用体(type-safe union)の実装であるvariantクラスが導入されます。 このクラスは、テンプレート引数で与えた候補型のリストに含まれる型のオブジェクトを代入できる型です。また、ビジター関数オブジェクトを使用することにより、現在…
C++14で入りそうで入らなかったoptionalクラスですが、C++1zで入ることになりました。 optionalは、テンプレート引数で指定した型の値を有効値、std::nulloptという特殊なオブジェクトを無効値と見なす型です。 ひとつの型で有効値と無効値を表すために、int…
C++1zでは、コピー可能かムーブ可能であればどんな型でも代入できるanyクラスが入ります。C++には全ての型の継承元のobjectクラスというものはないので、その代わりにこのクラスを使えます。 このクラスのために、<any>ヘッダが新規追加されます。 #include <iostream> #inc</iostream></any>…
C++1zから、shared_ptrの入れ子型としてweak_typeが追加されます。 これは、shared_ptr<T>に対するweak_ptr<T>型の別名です。 shared_ptrの要素型を取り出してweak_ptrのテンプレート引数を埋めることが冗長なコードになっていたための対処です。 shared_ptr<T> sptr </t></t></t>…
Boost.勉強会 #20 東京に参加された皆さま、おつかれさまでした。発表資料はboostjpの以下のページにまとめてあります。 Boost.勉強会 #20 東京 - boostjp 次回のBoost.勉強会は、札幌で行います。主催は@ignis_fatuusさんです。 Boost.勉強会 #21 札幌 - co…
Boost.勉強会 #20 東京 - connpass 明日はBoost.勉強会です。いつものように、IIJ様の会場をお借りして開催します。 私はBoost 1.61.0のアップデート内容と、C++1z (C++17になる予定のバージョン)の全容を解説します。 発表資料は、boostjpサイトの以下のペ…
これまで、述語(predicate)を反転させるためには、std::not1()とstd::not2()という関数がありました。 これらの関数はそれぞれ1引数の述語関数オブジェクト、2引数の述語関数オブジェクトを対象としますが、C++11で導入された可変引数テンプレートがあれば、…
basic_stringクラスが保持している動的文字配列の生ポインタを取得するdata()メンバ関数ですが、C++14まではconstメンバ関数のみ用意されていました。 C++1zでは、非const版のdata()メンバ関数が追加されます。これにより、char*を要求するインタフェースに…
シーケンスコンテナのemplace_front()メンバ関数とemplace_back()メンバ関数は、C++14では戻り値型がvoidでしたが、C++1zでは追加された要素への参照が返るようになります。 これは、追加した要素をすぐ使いたい場合に、以下のような冗長なコードになってい…