問題タブ [constexpr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
723 参照

c++ - std::piecewise_construct は ODR 違反を引き起こしませんか?

std::piecewise_construct<utility> で定義されている は、宣言されているため、内部リンケージがありconstexprます。std::piecewise_constructヘッダーで を使用すると、ODR に違反する可能性があるのではないかと思います。例えば:

a.hpp

翻訳単位 1

翻訳単位 2

TU 1のstd::piecewise_constructinは、TU 2のfin とは異なるオブジェクトを参照しています。ODR に違反していると思われます。ff

N3290 (おそらく ISO/IEC 14882:2011 も) は、次のケースは 3.2/5 の ODR の例外であると述べています。

オブジェクトが D のすべての定義で同じリテラル型を持ち、オブジェクトが定数式 (5.19) で初期化され、値 (アドレスではない) がオブジェクトが使用され、オブジェクトは D のすべての定義で同じ値を持ちます。

fほとんどすべての要件を満たしていますが、「オブジェクトの値(アドレスではなく)が使用される」というのは曖昧に思えます。状態がないのは事実ですstd::piecewise_construct_tが、 の区分コンストラクターの呼び出しには、引数が であるstd::pairの暗黙的に宣言されたコピー コンストラクターの呼び出しが含まれます。アドレスは「使用済み」ですね。std::piecewise_construct_tconst std::piecewise_construct_t &

とても困惑しています。

参照: http://lists.boost.org/Archives/boost/2007/06/123353.php

0 投票する
1 に答える
995 参照

c++ - 静的constexprメソッドの実装はgccバグを引き起こしますか?

これがコードの一部です:

私が基本的に行うことはstatic constepxr、クラス宣言でメソッドを宣言し、それを実装することです。

元のコードは2つのファイルに分割され、必要なコードのみを残して、削除されたメソッド/属性がさらに含まれていました。

コードをコンパイルすると、GCC4.6.0から次のエラーが発生します。

  1. これは本当にバグですか?

  2. その場合、レポートに何を提供する必要がありますか?


オンラインのC++0xコンパイラでコードをテストしたところ、次のエラーが発生しました。

このコンパイラはGCC4.5.1を使用します。コードの形式が正しくないことを知らせてくれましたが、さらに質問があります。

  1. GCC 4.5.1でエラーが発生し、GCC 4.6.0でバグが報告されるのはなぜですか?

最後の段落を書いた後、GCC 4.6.0でstaticキーワードを削除してテストし直したところ、別の実装が警告なしにコンパイルされました。

  1. 同じファミリの2つのコンパイラがこれほど異なる動作をするのはなぜですか?

メソッドは、GCC4.5.1エラー報告を説明する可能性のあるとはconstexpr異なるステートメントを回避する必要があることを知っています。return私のメソッドはマクロ条件を使用して適切な(定数)値を返すため、(通常の推奨事項に加えて)分離された実装を使用する理由を説明する数行が必要です。


私の構成:

0 投票する
1 に答える
1822 参照

c++ - constexprを返す関数はコンパイルされません

なぜこれがコンパイルされないのですか:リターンタイプとしてのa
に問題がある可能性がありますか?string

0 投票する
6 に答える
67145 参照

c++ - 静的 constexpr char[] への未定義の参照

static const charクラスに配列が必要です。GCC は不平を言い、 を使用するように言いましたconstexprが、今では未定義の参照だと言っています。配列を非メンバーにすると、コンパイルされます。何が起こっている?

0 投票する
2 に答える
3446 参照

c++ - 同じクラス内のテンプレートパラメータとしてconstexprを使用するとエラーが発生します

次のC++0xコードをコンパイルしようとすると、エラーが発生します。

gcc 4.6.1では、エラーメッセージは次のとおりです。

clang 2.8では、エラーメッセージは次のとおりです。

関数を基本クラスに移動するconstexprと、gccで機能し、clangで同じエラーメッセージが表示されます。

コードは間違っていますか、それともgcc4.6のC++ 0xの実装の制限またはバグですか?コードが間違っている場合、なぜそれが間違っているのですか、そしてC ++ 11標準のどの節がそれが間違っていると言っていますか?

0 投票する
5 に答える
4778 参照

c++ - ユーザー定義のリテラル引数は constexpr ではありませんか?

ユーザー定義リテラルをテストしています。_fac数値の階乗を返すようにしたい。

関数を呼び出すことはconstexpr機能しますが、引数が ではなく、 ではないとコンパイラが不平を言うため、テンプレートでそれを行うことはできませんconstexpr

私はこれに混乱しています - リテラルは定数式ではありませんか? 5in5_facは常にコンパイル時に評価できるリテラルですが、なぜそれをそのまま使用できないのでしょうか?

最初の方法:

2 番目の方法:

0 投票する
5 に答える
11312 参照

c++ - なぜC++ 11 constexprはそれほど制限的ですか?

ご存じのとおり、C++11 ではconstexprキーワードが導入されました。

C++11 ではキーワード constexpr が導入されました。これにより、ユーザーは関数またはオブジェクト コンストラクターがコンパイル時の定数であることを保証できます。[...]これにより、コンパイラは[関数名]がコンパイル時の定数であることを理解し、検証できます。

私の質問は、宣言できる関数の形式になぜそのような厳しい制限があるのか​​ということです。関数が純粋であることを保証したいという欲求は理解していますが、次のことを考慮してください。

関数で constexpr を使用すると、その関数で実行できることがいくつか制限されます。まず、関数には void 以外の戻り値の型が必要です。次に、関数本体で変数を宣言したり、新しい型を定義したりできません。第 3 に、本文には、宣言、null ステートメント、および 1 つの return ステートメントのみを含めることができます。引数置換後に return ステートメントの式が定数式を生成するような引数値が存在する必要があります。

つまり、この純粋関数は不正です。

また、ローカル変数を定義することはできません... :(だから、これは設計上の決定なのか、それとも関数 a が純粋であることを証明することになると、コンパイラはうまくいかないのでしょうか?

0 投票する
6 に答える
20209 参照

c++ - クラス static constexpr での C++ リンカ エラー

次の単純なプログラムをコンパイルしていますg++-4.6.1 --std=c++0x

次のリンカ エラーが発生します。

インラインで定義された静的メンバーにはシンボルが定義されていないことを認識していますが、使用するconstexprとコンパイラにシンボルを常に式として扱うように指示したという (おそらく欠陥のある) 印象を受けました。そのため、コンパイラは、シンボルへの参照を渡すことは正当ではないことを認識しますS::X(同じ理由で、リテラルへの参照を受け取ることはできません10)。

ただし、S が名前空間として宣言されている場合、つまり「構造体 S」ではなく「名前空間 S」である場合、すべて正常にリンクされます。

これはg++バグですか、それともこの煩わしさを回避するためにトリックを使用する必要がありますか?

0 投票する
6 に答える
17359 参照

c++ - C ++ 11では、sqrtはconstexprとして定義されていますか?

C ++ 11では、std::sqrtとして定義されています。つまり、他の関数から、または配列サイズやテンプレート引数などのコンパイル時のコンテキストconstexprで合法的に使用できますか?constexprg ++は(を使用して-std=c++0x)それを許可しているようですが、c ++ 0x / c ++ 11のサポートがまだ不完全であることを考えると、それを信頼できるものと見なすことができるかどうかはわかりません。インターネットで何も見つからないように見えるので、不安になります。

これはグーグルを使って簡単に見つけられるもののようですが、私は(今40分間...)試しましたが、何も見つかりませんでした。constexprを標準ライブラリのさまざまな部分(たとえばこれsqrtなど)に追加するためのいくつかの提案を見つけることができましたが、他の数学関数については何もありませんでした。

0 投票する
2 に答える
18578 参照

c++ - C ++ 11-constexpr関数内のstatic_assert?

static_assert関数内でどのように適切に実行しconstexprますか?例えば:

constexpr関数にはreturnステートメントのみが含まれている必要があるため、これは有効なC++11コードではありません。この標準に例外があるとは思いませんが、GCC4.7ではこのコードをコンパイルできません。