問題タブ [constant-expression]
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.
c++ - 非定数式関数の組み込み関数を定数式と見なす gcc はありますか
問題のより良いサンプルについては、アップデートを参照してください。元のコードには、画像を混乱させる問題が混在しています。
この質問constexpr 関数内で非 constexpr 関数を呼び出すことができるのはなぜですか? 次のコードを提示しました
私が答えると、これは形式が正しくありませんが、それをgcc 4.8.2
許可します(ライブで参照してください)。
ただし、-fno-builtin
フラグを使用gcc
するとエラーが発生します (ライブで参照してください)。
そのため、組み込みバージョンの が定数式でseems
あると見なされます。ここではビルトインについて説明していますが、非 constexpr 関数のビルトインを定数式と見なすことができるこのケースについては説明していません。gcc
printf
gcc
これが実際に当てはまる場合:
- コンパイラはこれを行うことができますか?
- それらが許可されている場合、準拠していることを文書化する必要はありませんか?
- これは拡張機能と見なすことができますか?もしそうなら、C++ ドラフト標準セクションの
1.4
実装準拠の段落8にあるように、これには警告が必要なようです(強調鉱山):
適合する実装には、整形式プログラムの動作を変更しないという条件で、拡張機能 (追加のライブラリ関数を含む) が含まれる場合があります。実装は、この国際標準に従って不適切な形式の拡張機能を使用するプログラムを診断する必要があります。ただし、そうした後は、そのようなプログラムをコンパイルして実行できます。
アップデート
Casey が指摘しているように、元の問題にはいくつかのことが起こっており、それが悪い例になっています。簡単な例では、constexpr 関数ではないstd::powを使用します。
警告やエラーなしでコンパイルおよびビルドしますが (ライブを参照)、追加-fno-builtin
するとエラーが発生します (ライブを参照)。注: C++11 で数学関数が constexpr でない理由:
c++ - 未評価のオペランドではラムダ式が許可されないのに、定数式の未評価部分では許可されるのはなぜですか?
C++ 標準セクションのドラフトを見ると、5.1.2
ラムダ式の段落2には次のように書かれています (私のものは今後も強調されます)。
ラムダ式の評価は、一時的な prvalue (12.2) になります。この一時的なものはクロージャー オブジェクトと呼ばれます。ラムダ式は、未評価のオペランドに現れてはなりません(第 5 節)。[ 注: クロージャー オブジェクトは関数オブジェクト (20.8) のように動作します。—終了注]
およびセクション5.19
定数式の段落2は次のように述べています。
conditional-expressionは、潜在的に評価される部分式 (3.2) として次のいずれかが含まれていない限り、コア定数式ですが、評価されない論理 AND (5.14)、論理 OR (5.15)、および条件付き (5.16) 演算の部分式は含まれません。考慮されません[...]
次の箇条書きがあります。
— ラムダ式 (5.1.2);
では、評価されていないオペランドではラムダ式が許可されていないのに、定数式の評価されていない部分では許可されているのはなぜでしょうか?
各ラムダには一意の型があるため、評価されていないオペランドの場合、いくつかのケース ( decltypeまたはtypeid ) の型情報があまり役に立たないことがわかります。定数式の未評価のコンテキストでそれらを許可したい理由は明らかではありませんが、おそらくSFINAEを許可するためでしょうか?
sql-server-2008 - 列のすべての行に対して一定のテキスト文字列を返す (動的) SQL Server 2008
お時間と専門知識をお寄せいただきありがとうございます。
次のクエリを使用します
次のようなテーブル結果を取得するには
私の結果は、定数列の値が実際にはどのテーブルのどこにも配置されていない以下のようになる必要があります。むしろ、返される行数に関係なく動的に返され、結果セットは常にすべての行に対してテキスト「リンク」を返します。
java - Java 定数式とコードの削除
hereで説明されているように、javac およびその他の Java コンパイラはif
、条件が「定数式」であるステートメントのコード削除機能を提供する場合があります。
私のコードが別のパッケージで定義された他の定数式に依存する定数式を使用している場合、これはどのような影響を受けますか?
たとえば、指定されたそれぞれのパッケージに次のクラスがあるとします。
と
明らかに、foo
-package が実行時に外部の jar ファイルからロードされた場合、コンパイラはそれFoo.CONDITION
が false になると技術的に想定することはできずtrue
、-statement のif
-branch を削除すべきではありません。
一方、Foo
とBar
が実際に同じパッケージにある場合、true
-branch は確実に削除する必要があります (コンパイラがコードの削除をサポートしている場合)。
この質問をどのように表現するのが最適かはよくわかりませんが、 の定数式が の定数と見なされるには、どれだけ「近い」Foo
必要がありますか? それらは同じファイルにある必要がありますか?同じパッケージ?同じjarファイル?それともまったく問題ではありませんか (つまり、コンパイラは常に定数と見なし、コンパイル時にビルドパスで見つかった値を使用します)?Bar
Foo
Bar
Foo.CONDITION
c++ - 動的な方法での一定の初期化
const
として宣言された変数はのみ適用されると思いますStatic Initialization
。私は次のように書いています。
そしてそれはうまくいきます。
しかし、 は であり、 ではないため、コードは無効であると予想してnew A()
いnew-expression
ましたconstant expression
。実際:秒。5.19/2 N3797:
条件式 e は、抽象マシン (1.9) の規則に従って e を評価した場合に、次の式のいずれかが評価されない限り、コア定数式です。
[...]
— 新しい式 (5.3.4) ;[...]
と
定数式は、値が静的ストレージ期間を持つオブジェクトまたは関数を参照する glvalue コア定数式のいずれかです。
c++ - 関数の引数として std::array の第 2 引数 (サイズ) を取得する
次のコードではstd::array
、関数の引数としてのサイズを取得する必要があります。コンテナのサイズは変わらないはずなので、私はそれを好みstd::array
ました。std::vector
ただし、コンパイラは次のように文句を言いますerror: ‘n’ is not a constant expression
。関数の引数から配列のサイズを取得するにはどうすればよいですか?
main.cpp:
c++ - コンパイル時に既知の定数 array1 を使用して C++ array2 を初期化します
次の配列があります。
次のように、重複した配列を初期化します。
次のように cygwin で g++ 4.8.2 を実行すると:
次のエラーが表示されます。
ただし、明らかに " int a[4] = { A };
" も機能しません。頼らずに単純な割り当てステートメントを使用して配列を初期化する方法はありますかa
:A
?
c++ - 変数の初期化で定数式の値として数学的計算を記述すると、計算作業が増加しますか?
C++ では、定数変数の初期化での数学的な宣言には余分な処理が必要ですか? または、最新のコンパイラは、.exe ファイルを作成するときに、数学計算の結果を変数内に自動的に配置しますか?
例えば:
メソッドの使用法 (この場合はコンストラクター) 全体で定数変数 (defaultX) を使用するコードの例です。ここで、開発者が値の由来を伝える方がよい場合があります。
もちろん、彼はそれをコメントの中に入れることもできますが、彼がこのようにしたいと仮定しましょう (例: 彼は頭が悪い)。問題は、そのクラスのオブジェクトが初期化されているときに、数式全体が計算されるか (余分な処理が必要になるか)、または最新のコンパイラによって .exe が作成されるときに、最初の MyClass コードで見られる最適化されたコードが既に含まれているかどうかです。 ?