C++

C++1z 不明な属性を無視する

C++

標準で定義される属性のほかに、実装定義の属性がありますが、その実装定義の属性を認識できない他の処理系では、その実装定義の属性は無視されることが規定されます。属性指定の文脈で#ifdefを書かなくてよくなります。 // GCC/Clangではgnu::deprecated属…

C++1z 属性の名前空間指定に繰り返しをなくす

C++

標準外の属性は、名前空間内に定義されている場合があります (例として、GCCが定義している属性はgnu名前空間に属している)。属性指定の文脈でその名前空間を何度も書かなくてよいように、名前空間を省略するための機能がC++1zで入ります。 [[ using CC: opt…

C++1z 名前空間と列挙子への属性付加を許可

C++

C++1zでは、名前空間と列挙子の構文に、属性が付けられるようになります。標準の属性としては、[[maybe_unused]]属性が列挙子に付けられるようになります。 namespace 名前空間名 属性 {} enum 列挙型 { 列挙子 属性, }; // [[maybe_unused]]属性の例 enum …

C++1z 戻り値を捨ててはならないことを指定する[[nodiscard]]属性

C++

C++1zから、関数の戻り値をユーザーに無視しないでほしい場合に指定する[[nodiscard]]属性が導入されます。 この属性は、エラーが起きた状態でエラーを無視して正常として処理を続けないでほしいような状況で使用します。 struct error_info { … }; // 関数f…

C++1z 使用しない可能性のある変数に対する警告を抑制するための[[maybe_unused]]属性

C++

関数void f(int a) {}のパラメータaのように、実行時に使用しない可能性のある識別子は、コンパイル時に警告が出力されることがあります。 使用しないことが意図したものであることをコンパイラに伝えて警告を抑制するために、C++1zから[[maybe_unused]]属性…

C++1z フォールスルー時の警告を抑制する[[fallthrough]]属性

C++

switch文で下のcaseに処理を流すことを「フォールスルー (fallthrough)」と言います。 #include <iostream> int main() { int n = 1; switch (n) { case 1: std::cout << "1" << std::endl; // break; を書かずに、処理を下に流す case 2: std::cout << "2" << std::en</iostream>…

C++1z C標準ライブラリの参照をC11に更新

C++

C++14段階では、C++標準ライブラリはC99のC標準ライブラリを参照していました。C++1zでは、C11標準ライブラリを参照するようになります。C11標準ライブラリのすべての機能に対応するわけではありません。 <stdatomic.h>, <stdnoreturn.h>, <threads.h>に対応するC++ヘッダは用意しない <cfloat>に以下のマク</cfloat></threads.h></stdnoreturn.h></stdatomic.h>…

C++1z 非推奨だったiostreamのエイリアスを削除

C++

標準入出力ライブラリで、C++98のころから非推奨だった型の別名と関数の別名が、C++1zで削除されます。 まず、std::ios_baseクラスの以下のメンバ型が削除されます: namespace std { class ios_base { public: typedef T1 io_state; typedef T2 open_mode; …

Boost 1.62.0がリリースされました

C++

Version 1.62.0 - Boost C++ Libraries Boost 1.62.0リリースノート - boostjp Boost 1.62.0がリリースされました。 リリースノートはいつものように、boostjpサイトで翻訳したものを公開しています。Flastさん、協力ありがとうございました。 新ライブラリ …

C++1z std + 数字の名前空間を予約

C++

C++の今後のメジャーバージョンアップで標準ライブラリに大きな変更を加えるときのために、「std + 数字」の名前空間が予約されます。std2とかの名前空間を作りたいのだそうです。 参照 P0180R2 Reserve a New Library Namespace Future Standardization Alt…

C++1z 並列アルゴリズムライブラリ

C++

C++1zでは、並列アルゴリズムのライブラリが導入されることになりました。このライブラリは、<algorithm>, <numeric>, <memory>で定義されるアルゴリズムのオーバーロードという形で提供されます。 using namespace std::execution; // 実行ポリシーの名前空間 std::vector<int> v = … std::so</int></memory></numeric></algorithm>…

C++1z 初期化子リストからpairとtupleを構築しやすくするための改善

C++

C++14では、以下のコードがコンパイルエラーになります。 std::tuple<int, int> pixel_coordinates() { return {10, -15}; // コンパイルエラー } struct NonCopyable { NonCopyable(int); NonCopyable(const NonCopyable&) = delete; }; std::pair<NonCopyable, double> pmd{42, 3.14}; // </noncopyable,></int,>…

C++1z has_unique_object_representations型特性

C++

少しまえから、オブジェクトからハッシュ値の計算を自動的に行いたい、という話がでていました。C++1z時点ではそのサポートは入りませんが、前準備として、自動的にハッシュ値を求められる型かを判別するためのhas_unique_object_representationsという型特…

C++1z 未初期化メモリのアルゴリズムと、デストラクタ呼び出しの関数

C++

C++標準ライブラリには、データ構造を実装する際に使用する未初期化メモリに対するアルゴリズムが<memory>ヘッダで定義されています。 C++1zでは、厳しいパフォーマンス要求があるデータ構造を実装しやすくするためのアルゴリズムが、いくつか定義されます。これらは</memory>…

C++1z unique_ptrのテンプレート代入演算子に、不足していたSFINAEルールを追加

C++

unique_ptrの以下の代入演算子に、オーバーロード解決に参加する条件が不足していました。 template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; C++14時点では、以下の2つの条件になっています。 unique_ptr<U, E>::pointerが、pointerに暗黙変換可能な型</u,></u,></class>…

C++1z 乱数用語を変更

C++

C++11で導入された乱数ライブラリでは、乱数生成器のコンセプトに 「URNG (Uniform Random Number Generator, 一様乱数生成器)」という用語を使用していました。 しかし、一般的なURNGの用語とは異なり、C++の乱数生成器は一度の呼び出しで、(32ビットを超え…

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()という関数です…