問題タブ [variable-templates]
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++ - 変数テンプレートを使用して別の変数テンプレートを宣言できますか?
C++14 (および Clang は既にそれらをサポートしている) で変数テンプレートが登場し、標準is_same_v
および同様の型特性の提案があるため、次のように新しい型特性を作成できると便利だと思いました。
残念ながら、これにより、次の SSCCE と同等のエラーが発生します (これには、以下で説明するすべてが含まれています)。
この行をmain
コメント化すると、Clang は次のように出力します。
警告: 変数
is_pointer<type-parameter-0-0>
には内部リンケージがありますが、定義されていません
私には定義されているように見えます( inT
への変更は正常に機能することに注意してください)。インスタンス化する行のコメントを外すと、次のようになります(これも正常に動作します)。int *
foo
main
foo
T
int *
エラー: constexpr 変数
foo<int *>
は定数式で初期化する必要があります
ただし、次の古い構文に置き換えるfoo
と、両方のインスタンスが正常に機能します。
変数テンプレートについて欠けているものはありますか? それらを使用して新しい変数テンプレートを作成する方法はありますか、それとも古い構文を使用して新しい変数テンプレートを作成し、他のコードに使用するときにのみ構文シュガーを楽しむ必要がありますか?
c++ - Clang 自動変数テンプレートのバグ
変数テンプレートの宣言で auto を使用できるかどうかを調べに行きました。
結構ですが、使用しようとするとすぐにクラップスが鳴ります。
,の任意の組み合わせはdecltype(auto)
、それが左辺値auto
であると言われていても機能しません。auto
私は前にこのように自動行動を見たことがありません. 変数テンプレートのためですか、それともclangがautoを扱う方法のためですか?
c++ - 再帰変数テンプレート
他のテンプレートと同じように変数テンプレートを使用しようとしていました。たとえば、静的値または列挙値をラップするテンプレート オブジェクトを使用したメタプログラミングを使用して、フィボナッチ数または数のべき乗を計算する方法は既にわかっています。
そのため、最初にテンプレート変数を特殊化しようとしましたが、期待どおりに機能します。
変数テンプレートの特殊化が可能であることを知っているので、変数テンプレートのフィボナッチ数を実行しようとしました:
Wandboxから取得したエラーは次のとおりです。
何が間違っているのか、エラーを理解していないのかわかりません。エラーは、変数テンプレートを既に使用している間にまだ定義されていないという事実に関連している可能性があると推測しているため、変数テンプレートで目標を達成することさえ可能かどうか疑問に思っています。
ヒントはありますか?
どうもありがとう。
c++ - C++14 警告: 変数のテンプレート ヘッダーが多すぎます (0 にする必要があります)
最近の g++-5 コンパイラを試しているときに、以下のステートメントをファイルに書きました。
結果は次のとおりです。
警告: のテンプレート ヘッダーが多すぎます
a
(0 にする必要があります)
また、効果的には、実際には特化していませんa<int>
。例えば
この構文の謎は何ですか?
c++ - タイプ以外の引数を転送すると、変数テンプレートで異なる動作が発生する
これもまた「誰が上手いの?」のようです。gcc 6.0.0 と clang 3.7.0 の動作が異なるため、質問です。
const char *
非テンプレート引数として取り、特定のポインターに特化した変数テンプレートがあるとします。
テンプレート変数は、特殊化に応じて異なる型を持つことに注意してください。10 には 2 つのテンプレート関数があり、それぞれがconst char *
非テンプレート引数として受け取り、それを変数テンプレートに転送します。
次に、この関数を呼び出すと、異なる動作が発生します。
clang 3.7.0 は(私が予想していたように) を出力しFOO
、void Struct::function() const
gcc 6.0.0 は以下のエラーでコンパイルに失敗します:
非クラス タイプ 'char [8]' である 'Value' のメンバー 'function' の要求
gcc がテンプレートの非型引数を関数内の変数テンプレートに転送できなかったことはほぼ確実です。このため、型を持つ特殊化されていない変数テンプレートを選択します...NAME
Value
call_function
'char [8]'
テンプレート引数をコピーしているように動作しています。これは、オブジェクトのメンバー関数を呼び出した場合にのみ発生します。の本体をコメント化するとcall_function
、出力はFOO
notUNKNOWN
になるため、print
関数内では gcc でも転送が機能します。
そう
- 正しい動作は何ですか?(mi ベットは clang 用です)
- 間違ったことをしているコンパイラのバグチケットを開くにはどうすればよいですか?
c++ - C++14 での変数テンプレートの部分的な特殊化とエイリアス
次のビット マスクの配列をよりコンパクトなバージョンに変換しようとしています。
これが私が持っているものです...
クライアント コードでこれをさらに単純化したいので、std::make_index_sequence を書き出す必要はありません。どうやってやるの?正しい構文を取得できず、これが機能するかどうかもわかりません。
それはコンパイルされません。length_mask の宣言/定義はどうすればよいですか?
c++ - テンプレート クラスの変数テンプレート - 予期しないエラー (バグの可能性?)
持つ:
(0) イデオン
clang++ 3.6 ではコンパイルできません。
エラー: テンプレート引数リストがないと、変数テンプレート '値' を参照できません
g++ 5.2 ではコンパイルできません。
エラー: 'template constexpr const T Value::value' は関数テンプレートではありません
(1) イデオン
clang++ と g++ の両方でコンパイルできます。
(0)がコンパイルに失敗するのはなぜですか?
テンプレート パラメーター (この場合は ) を介して変数テンプレートにアクセスすると、問題が発生するようですTValue
。キーワードの型エイリアスを定義するTValue
か、typename
キーワードを使用しても問題は解決しません。
何が起きてる?