問題タブ [narrowing]
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++ - リテラルから絞り込んでも警告は発生しません
int a = 0; short b{a}; short c{0};
コンパイラは に対して警告を発しshort b{a}
ます。int
に絞られるので、これは理解できますshort
。
short c{0}
しかし、それは私には奇妙に警告を与えません。リテラル整数について覚えていますが、 の型は0
少なくとも である必要がありますint
。int
からへの絞り込みshort
はここで起こっています。コンパイラが警告を出さないのはなぜですか?
c++ - 強制縮小変換警告
いくつかの縮小変換を示す次のコードを検討してください。
メンバーの本体を変更して、wrapper
変換を縮小するためのコンパイラ警告をトリガーする方法は? 私の目標は、コードに問題がある可能性があることをユーザーに認識させることです。
c++ - 絞り込み、未評価のコンテキストとテンプレート関数
次のコードを検討してください。
エラーが発生して(予想どおり)コンパイルされません。
{ } 内の 'double' から 'int' への '0.0' の縮小変換
GCCとclangの両方がこれに同意しています。
次に、以下のコードを検討してください。
この場合、clang 3.9 はエラーを返し、GCC 6.2 はエラーなしでコンパイルされます。
関数テンプレートの場合、縮小変換を受け入れなければならない理由はありますか、それとも GCC のエラーですか?
コンパイルに失敗するはずなので、GCC に問題を開くつもりですが、ここで関数テンプレートに関する重要な何かが欠けているかどうかを知りたいです。
c++ - 初期化子リストのコンテキストでのナローイングの奇妙な動作
これが警告なしでコンパイルされる理由を誰かが知っていますか
しかし、しません
警告:
c++ - 割り当てリストと初期化子リストの間の C++11 でのナローイングの違い
C++11 は初期化リストを提供してくれました。これらは縮小変換を実行しないことを学びました。これにより、既存のコードのコンパイルが中断されることがあります。たとえば、暗黙的に int 拡張された値を使用して列挙値を操作する場合です。
の初期化はtest
、キャストなしではコンパイルされません。
私が探しているのは、x
まだ機能している割り当ての初期化の背後にある理論的根拠です。
typescript - TypeScript の型推論 / 狭小化の課題
現在、既存のコードの型を改善しようとしています。私のコードはおおよそ次のようになります。
メッセージ ハンドラー (where is) に渡されるメッセージの型を明示的に絞り込む必要をなくしたいと思います。/*REMOVE THIS TYPE HINT!*/
これにより、一致する型を持つ型に正しく絞り込まれますmessageType
(たとえば、 if messageType
is "ADD_COMMENT"
then message
be AddCommentMessage
)。
これが現在不可能な場合は、お知らせください。そうではないという印象を受けましたが、よくわかりません。
c++ - 組み込み型のオブジェクトでオーバーフローが発生すると、例外/未定義の動作が発生するのはなぜですか?
私が言えることから、「オーバーフロー」は「ナローイング」と非常によく似ています(完全に同じではないにしても)。
たとえば、値が 255 の unsigned char オブジェクト。そのビット パターンはすべて 1 になります: 1111 1111
したがって、オブジェクトに 1 を追加することによって: char_object++;
一部の一時オブジェクトで拡大が発生し、それに 1 が追加されるため、(一時オブジェクトの) ビット パターンは 256: 0000 0001 0000 0000 になります。
次に、一時オブジェクトが元のオブジェクトにコピー割り当てされ、ナローイング (左端のバイトが失われる) が発生し、値が 0 のままになります。
これがナローイングと同じように機能する場合、一部のマシンでオーバーフローが例外を引き起こすと標準が示唆しているのはなぜですか? 一部の本では、結果として未定義の動作が示唆されています。これは、ナローイングが上記のマシンで同じことを行うことを意味するのではないでしょうか? それらが同じものではない場合、それらはどのように異なるのですか?
(編集 :) おそらく、符号なし 8 ビット オブジェクトのビット パターンと符号付き 8 ビット オブジェクトのビット パターンを比較することによって、これをより明確にすることができますか? 2 の補数では、ビット パターンは変わらないようですが、表現は変わります。とにかく、これはまだ「ナロイングとオーバーフローの違いは何ですか?」という質問に真に答えているわけではありません。それらはまだ同じもののように見えるため: