C++17標準ライブラリの細かい変更いろいろ その1

最近cpprefjpに書いたものを列挙します。

  • assertマクロがconstexpr関数内で使用できるようになった
  • std::next()関数のイテレータ要件がForward IteratorからInput Iteratorに緩和された
  • std::addressof()const T&&の引数を禁止にした。addressof<const T>(T())のようにするとconst T&&が指定できていた
  • std::addressof()がconstexprに対応した
  • std::mutexとかstd::recursive_mutexlock()メンバ関数が、device_or_resource_busyのエラーを起こらなくした
  • 非順序連想コンテナのreserve()メンバ関数が、C++14までn-1以上の予約していたが、C++17からn以上が予約されるようになった
  • std::shared_ptr<const void>のようなテンプレート引数に対して間接参照演算子が適用できるようになった
  • タプルのstd::get()関数に、const T&&版を追加。const付きで戻り値を返すと、その一時オブジェクトはconst T&&になっていたため
  • std::atomicクラスのテンプレート引数設定済みの別名として、atomic_uint8_tのような固定幅整数型を追加
  • std::atomicクラスvalue_typedifference_typeを追加。fetch系の関数Tではなくdifference_typeを受け取るよう変更された
  • std::numeric_limits::is_moduloの符号あり整数型に対する仕様が変更された。これまでは符号あり整数型がオーバーフローしたときの未定義動作としての最小値に戻る挙動をtrueとして扱っていたのをやめた。規格上は符号あり整数型はfalseで、処理系がオーバーフローしたときの動作をラップして最小値に戻る挙動として定義したときにtrueとなるようにした
  • std::vectorstd::dequestd::basic_stringshrink_to_fit()メンバ関数で、メモリを縮小して再割り当てが発生するときに、イテレータの無効化が起こることが明記された。明記されただけで、元々起こっていただろう
  • std::basic_stringのコンストラクタに、basic_string(const basic_string& str, size_type pos, const Allocator& a = Allocator());オーバーロードを追加