32

新しい緩和された C++14 constexpr rules により、コンパイル時のプログラミングはより表現力豊かになります。標準ライブラリもアップグレードして利用できるようになるのだろうか。特に 、std::initializer_liststd::pairstd::tuple、 、 、 、 、 、 、 、 、std::complexstd::bitsetおよび卸売std::arrayと​​してマークされる最有力候補のようです。constexpr

質問:

  • 標準ライブラリのどの部分がマークされるようになりましたconstexpr?
  • 他のどの部分にマークを付けることができconstexprますか?
  • たとえば、関数 from<cmath><algorithm>マークされていないのはなぜconstexprですか?
  • そうしない後方互換性の理由はありますか?
4

2 に答える 2

26

標準ライブラリのどの部分が constexpr とマークされるようになりましたか?

C++14、N3690について調べたドラフトから、これまでに次のように変更されconstexprます (C++11 標準と比較して)†:

  • std::error_categoryのデフォルトコンストラクタ
  • std::forward
  • std::move
  • std::move_if_noexcept
  • すべてのstd::pairの演算子比較
  • std::getstd::pairstd::tuple. _
  • std::make_tuple
  • すべてのstd::tupleの演算子比較
  • すべてのstd::optionalの演算子比較
  • のすべてstd::optionalのコンストラクター (移動用に保存)
  • operator[]およびその他のコンテナ用sizestd::bitset
  • すべてのstd::complexの演算子比較

私はこれを手動で行ったので、いくつかのエラーが予想されます :(

別のおそらくより正確なconstexpr追加のリストについては、確認できます: N3469N3470、およびN3471

constexpr とマークできる他の部分はどれですか?

可能性のあるものconstexpr(std::numeric_limits評価、std::tupleコンストラクターなど) のほとんどは、C++11 標準のようにstd::pair既にマークされています。の時点およびその他のコンポーネントが としてマークされないconstexprバグがありましたが、N3469 で修正されました。std::ratioconstexpr

constexpr追加の恩恵を受けるものはstd::initializer_listであり、今回は何も得られませんでした (それを許可する提案があったかどうかはわかりません)。

そうしない後方互換性の理由はありますか?

これは拡張であるため、古いコードはそのままコンパイルされ、形式が正しくないため、ほとんどのものは壊れません。ただし、ここで提供さconstexprれている例のように、それを持っていなかった古いものに追加すると、予期しない場合に驚くべき結果が生じる可能性があります(Thanks TemplateRex)

于 2013-08-05T07:16:19.750 に答える
4

先週 (2013 年 9 月 23 ~ 28 日)、標準委員会constexprは標準ライブラリのルーチンをさらに追加しました。

  • forward_as_tuple
  • operator ()すべての比較 / 論理 / ビットごとの名前付き演算子のメソッド。( less, greater, plus, minus, bitwise_and, -logical_ornot1残り)

@TemplateRex: コンパイル時の配列のソートに近づいています。

constexprただし、LWG issue 2013 も解決し、標準ライブラリの実装者は、標準で asとして定義されていない呼び出しを自由に行うことはできないと述べましたconstexpr。これは、実装間のその種の違いが一部のコードの動作を変更する可能性があるためです。

于 2013-10-01T19:18:33.090 に答える