問題タブ [c++14]
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++ - __builtin_ctz(0) または __builtin_clz(0) はどの程度未定義ですか?
バックグラウンド
長い間、gcc は多くの組み込みのビット操作関数、特に末尾と先頭の 0 ビットの数を提供してきました (接尾辞andを持つlong unsigned
andについても同様です)。long long unsigned
l
ll
— 組み込み関数:
int __builtin_clz (unsigned int x)
x
最上位ビット位置から始まる、先頭の 0 ビットの数を返します。が 0 の場合x
、結果は未定義です。— 組み込み関数:
int __builtin_ctz (unsigned int x)
x
最下位ビット位置から開始して、の末尾の 0 ビットの数を返します。が 0 の場合x
、結果は未定義です。
ただし、テストしたすべてのオンライン (免責事項: x64 のみ) コンパイラでは、結果は両方とも、基になる組み込み型のビット数を返しますclz(0)
。ctz(0)
試行された回避策
モードの最新の Clang SVN トランクは、std=c++1y
これらすべての関数を緩和した C++14にしました。これにより、 、、およびの 3 /組み込みconstexpr
のラッパー関数テンプレートの SFINAE 式で使用する候補になります。ctz
clz
unsigned
unsigned long
unsigned long long
このハックの利点は、必要な結果を提供するプラットフォームが、ctz(0)
テストする余分な条件を省略できることですx==0
(これは、マイクロ最適化のように見えるかもしれませんが、組み込みのビット操作関数のレベルまで既に下がっている場合は、大きな違い)
質問
組み込み関数clz(0)
とのファミリはどの程度未定義ctz(0)
ですか?
std::invalid_argument
彼らは例外をスローできますか?- x64 の場合、現在の gcc ディストリビューションの場合、基になる型のサイズが返されますか?
- ARM/x86 プラットフォームは違いますか (それらをテストするためにアクセスできません)。
- 上記の SFINAE トリックは、そのようなプラットフォームを分離する明確な方法ですか?
c++ - std::numeric_limits とは::数字は表すはずですか?
範囲内のどこかにある値を表す整数のようなクラスを作成しています。たとえば、 の値はbounded::integer<0, 10>
[0, 10] の範囲内にあります。このクラスでは、 と定義radix
しました2
。
の値は何であるべきdigits
ですbounded::integer<-100, 5>
か?
どうbounded::integer<16, 19>
ですか?
c++ - ポリモーフィック クロージャを格納する方法
C++1y は、多態的なラムダを提供します (つまり、auto
パラメーター型の一部として使用します)。
示されているように、ラムダによって生成されたクロージャを格納するのは簡単auto
です。変数を使用するだけです。vector
しかし、そのようなオブジェクトのを作成したいとします。つかむタイプはvector
?通常の答えは を使用することstd::function
ですが、この場合は機能しません。知る限り、ポリモーフィックのようなものがないためですstd::function
。つまり、これは C++1y では合法ではありません。
これが合法である場合、コールバックのコンテナーを作成するなどのことができます。各コンテナーは任意の引数セットで呼び出すことができ、それぞれが渡された引数の型に依存する型を返すことができます。auto
少なくとも理論上は、任意のコールバックの結果を変数に格納できます。
2 つの質問:
- C++1y で、さまざまなタイプのポリモーフィック ラムダ (のようなもの以外
boost::any
) を保持できる変数またはコンテナーを宣言する方法はありますか? - そのようなことが可能になることを期待するのは理にかなっていますか、それともこの種のことは静的型付けと互換性がありませんか?
c++ - テンプレート型で定義された配列の初期化
テンプレートパラメーターに基づいて constexpr として初期化したい配列があります (constexpr として初期化リストを必要とする答えを想定しているため、これには c++14 が必要になると思います)。
テンプレートがあるとしましょう
どこ
これで、type_traits std::extent を使用して配列サイズを再帰的に抽出できます
最終的にやりたいことは、T の次元を myarray の要素として持つ constexpr メンバーを生成することです
可変個引数テンプレート ref: How to construct std::array object with initializer listを使用して配列を初期化する良い方法のように見えるものを見てきました。
問題は、T?1 を指定して、T の次元を持つイニシャライザ リストまたは可変個引数テンプレートのいずれかを生成する方法です。
c++ - 変数テンプレートの変数は異なる場合がありますか?
ドラフト C++14 では、変数テンプレートのサポートが追加されました。提案 ( N3651 ) の例はすべて定数 ( または のいずれconstexpr
かconst
) を示していますが、私が知る限り、これは必須ではありません。変数テンプレートの変数は変化することがありますか。たとえば、割り当てられますか?
c++ - クラスメソッドの型推論を返しますか? C++1y
戻り値の型推定は、c++14 のメンバー関数に対して許可されていますか、それとも無料の関数に対してのみ許可されていますか?
暗黙のうちにそれが機能すると想定していたので質問しましたが、gcc 4.8.1 では内部コンパイラ エラー ("in gen_type_die_with_usage") が発生します。そのような不可解なエラーが発生したのは初めてなので、少し懐疑的です。それ以来、彼らが仕様を変更したことを私は知っています。
明確にするために、これは私にとってはうまくいきます:
しかし、これはしません:
これは標準草案で許可されていますか?
c++ - ローカルに定義された構造体で非ローカル (またはフリー) 変数をシミュレートする
この質問はおそらく、クロージャーをサポートするプログラミング言語の知識を持っている人にのみ意味があります。そうでない場合は、「なぜこれをやりたいのですか?」とコメントしないでください。そうする正当な理由はたくさんあります。
関数型言語では、既に定義されているローカル変数をキャプチャするローカル関数を定義するのが一般的です。C++ では、次のようになります (ただし、もちろん違法です)。
これを可能にするために、C++11 ではラムダ関数が導入されているため、実際にはかなり適切な方法で実行できます (ただし、関数型言語で一般的に行われているほど適切ではありません ;-) ):
私の質問は次のとおりです: functionsの参照によって自由変数を自動的にキャプチャできるようになったので、ローカルで定義されたstructsに対して実行できると便利ではないでしょうか? 理想的には、次のように書けるようになりたいです。
私が見つけた唯一の回避策は、すべての非ローカル (フリー) 変数をコンストラクターに引数として手動で渡すことです。これは、変数がたくさんある場合は少し面倒です。
すべての自由変数を引数として手動で渡すことを回避する他の回避策を知っていますか、またはこれらの種類の「環境を認識する」ローカルで定義された構造体が C++ の将来の拡張で考慮されるかどうかを知っていますか? (つまり、C++1y?)