C++

C++1z memory_order_consumeを一時的に非推奨化

C++

並行プログラミングでのアトミック操作をする上で、処理の順序保証をする仕組みとしてメモリオーダーがあります。C++の標準ライブラリではメモリオーダーが何種類か提供されていますが、C++1zではmemory_order_consumeというメモリオーダーが一時的に非推奨…

C++1z std::functionクラスのアロケータサポートを削除

C++

C++11で導入されたstd::functionクラスには、アロケータを受け取るコンストラクタとassign()メンバ関数がありました。しかし、その仕様が不明確であったことから、正しい実装が行われてきませんでした。 GCCの標準ライブラリ実装であるlibstdc++では、アロケ…

C++1z 古くなった機能を非推奨化

C++

C++1zから、標準ライブラリのいくつかの機能が非推奨となります。非推奨となった機能は将来のバージョンで削除される可能性がありますのでご注意ください。 std::iteratorクラス 自作イテレータを作るときに基本クラスとして使用するstd::iteratorクラスです…

C++1z 隣接イテレータ

C++

C++1zから、イテレータの分類に「隣接イテレータ (contiguous iterator)」というものが追加されます。 ランダムアクセスイテレータだけではポインタ操作ができるかわからないので、メモリが隣接していることを表すイテレータの分類を追加することになりまし…

C++1z 非推奨だったauto_ptr, random_shuffle, 古い<functional>の機能を削除

C++

C++1zでは、非推奨(deprecated)になっていた以下の機能が削除されます。既存のコードでこれらの関数を使用していた場合、コンパイルが通らなくなりますのでご注意ください。 古いスマートポインタ std::auto_ptrクラス C++11から非推奨。 代わりにstd::share…

C++1z INVOKEコンセプトに従った関数呼び出しをするinvoke()関数

C++

C++11から入ったstd::mem_fn()関数、std::bind()関数、std::result_ofメタ関数などは、どれもINVOKEコンセプトという仕様のもとに定義されています。 これらの機能は、関数オブジェクトをただ呼び出すだけでなく、 メンバ関数ポインタ + レシーバー + 引数を…

C++1z 配列版unique_ptrの型変換

C++

C++14まで、以下のコードは不適格(コンパイルエラー)でした: unique_ptr<Foo const * const []> ptr1(new Foo*[10]); Foo const * ptr = ptr1[9]; C++1zでは、このような型変換を許可するために、unique_ptrの配列に対する特殊化バージョンに、変換コンストラクタや変換代入演算子</foo>…

C++1z void_t

C++

C++1zから、SFINAEによる「型に対して特性の操作ができるか」を判定するメタ関数の定義を容易にするために、void_tというパラメータで任意の数の型を受け取ってなにもせずvoidを返す型が定義されます。 // <type_traits> namespace std { template <class...> using void_t = void; </class...></type_traits>…

C++1z コンテナのコピー・ムーブ、swap操作にnoexceptを追加

C++

C++14までコンテナのnoexceptは最小限でしたが、C++1zではアロケータのコピーやムーブが例外を投げる可能性があるかどうかに基づいて、noexceptが追加されます。これで、標準ライブラリを使用したプログラムがより強い例外安全性を保証できるようになります。…

C++1z 標準イテレータ全般とarrayの変更操作にconstexprを追加

C++

C++1zでは、以下の機能にconstexprが付きます。 <iterator> std::advance()関数 std::distance()関数 std::next()関数 std::prev()関数 std::reverse_iteratorクラスのメンバ関数、非メンバ関数すべて std::move_iteratorクラスのメンバ関数、非メンバ関数すべて コン</iterator>…

C++1z 連想コンテナ用のデフォルトの順序付け

C++

この機能はC++1z入りが取り消されました。 mapやsetのキーとなる型はデフォルトで、operator<で比較できる必要があります。連想コンテナのキーにできるようにするために、ユーザー定義型にoperator<を定義することもありますが、その比較演算を連想コンテナ…

C++1z 連想コンテナの接合

C++

C++1zでは、2つの連想コンテナを接合(splice)する機能が入ります。対象は、map、set、unordered_map、unordered_setとそれらのmulti版すべてです。 まず、特定の要素を抽出する機能として、extract()メンバ関数が追加されます。 node_type extract(const_ite…

C++1z mapとunordered_mapに、挿入失敗時の動作を規定した新たなメンバ関数を追加

C++

一意なキーを持つstd::mapとstd::unordered_mapに対して、2種類のメンバ関数が追加されます。対象には、std::multimapやstd::unordered_multimapおよび集合コンテナは含みません。 try_emplace()メンバ関数 : 挿入失敗時に、与えられたパラメータargs...を変…

C++1z ロケール依存なし、フォーマット解析なしの高速な文字列・数値変換

C++

C++1zから、低レイヤーの文字列・数値間の変換関数が導入されます。これは、ハイパフォーマンスな文字列処理をするための基礎を提供することを目的としています。 数値から文字列への変換はto_chars()、文字列から数値への変換はfrom_chars()という関数です…

C++1z 最大公約数と最小公倍数

C++

C++1zから、2つの値の最大公約数(Greatest common divisor)を求めるgcd()関数と、最小公倍数(Least common multiple)を求めるlcm()関数が導入されます。 これらの関数は、<cmath>ではなく数値計算用のC++ヘッダ<numeric>で定義されます。bool以外の整数型ならなんでも扱えま</numeric></cmath>…

C++1z タプルを任意の型のオブジェクトに変換するmake_from_tuple関数

C++

タプルを展開して関数呼び出しするapply()関数の導入に合わせて、タプルを任意の型に変換するmake_from_tuple()関数が導入されます。 apply()関数ではオブジェクトの構築までカバーができない(コンストラクタを呼び出せない)ので、そのコーナーケースをカバ…

C++1z タプルを展開して関数呼び出しするapply関数

C++

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 ランダムサンプリングアルゴリズム

C++

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 文字列検索アルゴリズム

C++

C++1zでは、文字列内の文字列を高速に検索するためのアルゴリズムとして、「ボイヤー・ムーア法 (Boyer-Moore)」と「ボイヤー・ムーア・ホースプール法 (Boyer-Moore-Horspool)」が導入されます。 これは、既存のstd::search()アルゴリズムを拡張する形で行…

C++1z 多相アロケータとメモリプール

C++

C++1zから、アロケートする型を規定しないアロケータと、それを利用したメモリプールの仕組みが導入されます。 std::allocator<T>クラスは型Tのオブジェクトをアロケートする機能を提供しますが、アロケートする型ごとにアロケータオブジェクトが必要になり、メ</t>…

C++1z 文字配列をコピーせず参照してbasic_stringライクな操作をするstring_view

C++

C++1zでは、所有権を持たない文字列クラスとして、basic_string_viewクラスが導入されます。その別名として、char文字配列を扱うstring_view、char32_t文字配列を扱うu32string_viewなどが定義されます。 このクラスは、文字列リテラルような文字配列に対し…

C++1z 型安全な共用体variantクラス

C++

C++1zから、型安全な共用体(type-safe union)の実装であるvariantクラスが導入されます。 このクラスは、テンプレート引数で与えた候補型のリストに含まれる型のオブジェクトを代入できる型です。また、ビジター関数オブジェクトを使用することにより、現在…

C++1z 統一的な有効値と無効値の表現をもつoptionalクラス

C++

C++14で入りそうで入らなかったoptionalクラスですが、C++1zで入ることになりました。 optionalは、テンプレート引数で指定した型の値を有効値、std::nulloptという特殊なオブジェクトを無効値と見なす型です。 ひとつの型で有効値と無効値を表すために、int…

C++1z なんでも代入できるanyクラス

C++

C++1zでは、コピー可能かムーブ可能であればどんな型でも代入できるanyクラスが入ります。C++には全ての型の継承元のobjectクラスというものはないので、その代わりにこのクラスを使えます。 このクラスのために、<any>ヘッダが新規追加されます。 #include <iostream> #inc</iostream></any>…

C++1z shared_ptr::weak_type

C++

C++1zから、shared_ptrの入れ子型としてweak_typeが追加されます。 これは、shared_ptr<T>に対するweak_ptr<T>型の別名です。 shared_ptrの要素型を取り出してweak_ptrのテンプレート引数を埋めることが冗長なコードになっていたための対処です。 shared_ptr<T> sptr </t></t></t>…

次回のBoost.勉強会は札幌です

C++

Boost.勉強会 #20 東京に参加された皆さま、おつかれさまでした。発表資料はboostjpの以下のページにまとめてあります。 Boost.勉強会 #20 東京 - boostjp 次回のBoost.勉強会は、札幌で行います。主催は@ignis_fatuusさんです。 Boost.勉強会 #21 札幌 - co…

明日はBoost.勉強会 東京です

C++

Boost.勉強会 #20 東京 - connpass 明日はBoost.勉強会です。いつものように、IIJ様の会場をお借りして開催します。 私はBoost 1.61.0のアップデート内容と、C++1z (C++17になる予定のバージョン)の全容を解説します。 発表資料は、boostjpサイトの以下のペ…

C++1z not_fn

C++

これまで、述語(predicate)を反転させるためには、std::not1()とstd::not2()という関数がありました。 これらの関数はそれぞれ1引数の述語関数オブジェクト、2引数の述語関数オブジェクトを対象としますが、C++11で導入された可変引数テンプレートがあれば、…

C++1z basic_string::data()メンバ関数の非const版

C++

basic_stringクラスが保持している動的文字配列の生ポインタを取得するdata()メンバ関数ですが、C++14まではconstメンバ関数のみ用意されていました。 C++1zでは、非const版のdata()メンバ関数が追加されます。これにより、char*を要求するインタフェースに…

C++1z emplace_frontとemplace_backで追加された要素を返す

C++

シーケンスコンテナのemplace_front()メンバ関数とemplace_back()メンバ関数は、C++14では戻り値型がvoidでしたが、C++1zでは追加された要素への参照が返るようになります。 これは、追加した要素をすぐ使いたい場合に、以下のような冗長なコードになってい…