2013-08-05 8 views
32

新しいrelaxed C++14 constexpr rulesでは、コンパイル時のプログラミングがより表現力豊かになります。スタンダード・ライブラリーもまたアップグレードされるかどうかは疑問です。特に、std::initializer_list,std::pair,std::tuple,std::complex,std::bitsetおよびstd::arrayは、constexprと記された主要候補のように見える。C++ 14標準ライブラリのどの部分が、どの部分をconstexprにすることができますか?

質問:標準ライブラリの部分がconstexprをマークされます

  • 他の部分と表示されますconstexpr
  • なぜ<cmath><algorithm>の機能がconstexprと表示されていませんか?
  • 下位互換性の理由はありませんか?
+2

好奇心が強い人は、libC++を見れば分かりますが、C++ 14のconstexpr-isationの作業は進行中です。 @MatthieuM。 –

+0

tnxでは、SVNトランクは確かにいくつかの 'C++ 14でのconstexpr'コメントを持っています。 – TemplateRex

答えて

26

標準ライブラリのどの部分にconstexprとマークされますか?私はC++ 14、N3690のために見てきたドラフトから

、以下は(C++ 11標準と比較して)これまでconstexprに変更されます&短剣;:

  • 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のコンストラクタのすべてのすべての
  • std::bitsetや他のコンテナのための
  • operator[]sizeを(移動のために保存)。
  • std::complexのオペレータ比較

&短剣のすべて。 私は手動でこれをしなかったので、あなたはいくつかのエラーを期待することができます:(

あなたがチェックすることができ constexprの追加の他、おそらくより正確なリストについては

N3469N3470、およびN3471

他の部分をマークすることができ

constexprの?

constexprstd::numeric_limits評価、std::tuplestd::pair construc可能性のもののほとんどはtorsなど)は、C++ 11標準ですでにconstexprとマークされていました。 std::ratioの時点および他のコンポーネントがconstexprとマークされていないが、N3469で修正されたバグがありました。

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

下位互換性の理由はありませんか?

これは拡張あるので、そのまま古いコードはまだコンパイルされ、何も今病気に形成されていないため、ほとんどのものが壊れたことはありません。しかし、それがなかった古いものにconstexprを追加すると、予期していないと驚くべき結果が得られます。provided here(Thanks TemplateRex)

+0

+1ありがとう、非常に素晴らしい概要。私はなぜa) 'std :: array 'が完全に 'constexpr'ではないのか、そしてb)なぜ修飾メンバーが(例えば' operator = 'std :: complex'は' constexpr'とマークされません。 [このQ&A](http://stackoverflow.com/q/17744842/819272)に示されているように、このような動作は既にClangによって実装されています。同様に、 ''と ' 'ヘッダ全体を' constexpr'にするための障害は何ですか?私はできるようになりたい。コンパイル時に配列をソートします。 – TemplateRex

+0

'constexpr'にあることができるルールはかなり緩和されています。 Clangのテストケースをチェックすると、例えばforループのようなものがありました。 @MatthieuM。 –

+0

はい、非常にリラックスしていますので、現行のN3690ドラフトは、実行可能なものに比べてかなり制限があると思います。理想的には、私は本当に好きです。 'std :: complex'と他の値クラスは完全に' constexpr'になります。 – TemplateRex

4

先週(2010年9月23-28日)スタンダード委員会は標準ライブラリの多くのルーチンにconstexprを追加しました。

  • forward_as_tuple

    • 事業者という名前のすべての比較/論理/ビット単位のoperator()方法。 (lessgreaterplusminusbitwise_andlogical_ornot1 - 残り)

    @TemplateRex:私たちは、コンパイル時に配列をソートするに近づいています。

    しかし、標準ライブラリの実装者が標準で定義されていない呼び出しをconstexprとしてconstexprにする自由を持っていないことを示すLWGの問題も解決しました。実装の違いによって、いくつかのコード。

  • +0

    更新のために+1 tnx! 'std :: reverse_iterator'(DRについて)についてはどうでしょうか?そして私は 'std :: forward_tuple'に似た、' std :: tie'に関するDRを提出しました(申し訳ありません)。 C++ 14が石に設定される前に 'constexpr'を得るチャンスはありますか? – TemplateRex

    +0

    ところで、あなたはC++のさらに自由な 'constexpr'のための委員会のサポートについての(主観的な)印象を与えることができますか?例えば。 'constexpr'ラムダに対するNBのコメントは本当に有望ですね。そして私はIOからの-apartと文字列変換 - が卸売りの 'constexpr'である' std :: bitset'の実装をコード化しました。そして、私は、言語が許すならば、図書館はいくつかの機会を残していると思う。なぜそれらが提案されなかったのかコメントできますか?そして、そのような広範な図書館拡張のためのC++の提案は好意的に受けられるだろうか? – TemplateRex

    +0

    私は追加のビットがなぜ提案されなかったのか言うことはできません。単純に追加を提案する論文はなかった。私が論文を書いて発行して提示したので、関数オブジェクトとforward_as_tupleが追加されました。 –

    関連する問題