標準ライブラリのどの部分が constexpr とマークされるようになりましたか?
C++14、N3690について調べたドラフトから、これまでに次のように変更されconstexpr
ます (C++11 標準と比較して)†:
std::error_category
のデフォルトコンストラクタ
std::forward
std::move
std::move_if_noexcept
- すべての
std::pair
の演算子比較
std::get
std::pair
とstd::tuple
. _
std::make_tuple
- すべての
std::tuple
の演算子比較
- すべての
std::optional
の演算子比較
- のすべて
std::optional
のコンストラクター (移動用に保存)
operator[]
およびその他のコンテナ用size
。std::bitset
- すべての
std::complex
の演算子比較
†私はこれを手動で行ったので、いくつかのエラーが予想されます :(
別のおそらくより正確なconstexpr
追加のリストについては、確認できます: N3469、N3470、およびN3471
constexpr とマークできる他の部分はどれですか?
可能性のあるものconstexpr
(std::numeric_limits
評価、std::tuple
コンストラクターなど) のほとんどは、C++11 標準のようにstd::pair
既にマークされています。の時点およびその他のコンポーネントが としてマークされないconstexpr
バグがありましたが、N3469 で修正されました。std::ratio
constexpr
constexpr
追加の恩恵を受けるものはstd::initializer_list
であり、今回は何も得られませんでした (それを許可する提案があったかどうかはわかりません)。
そうしない後方互換性の理由はありますか?
これは拡張であるため、古いコードはそのままコンパイルされ、形式が正しくないため、ほとんどのものは壊れません。ただし、ここで提供さconstexpr
れている例のように、それを持っていなかった古いものに追加すると、予期しない場合に驚くべき結果が生じる可能性があります(Thanks TemplateRex)