問題タブ [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.

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

c++ - リテラルから絞り込んでも警告は発生しません

int a = 0; short b{a}; short c{0};

コンパイラは に対して警告を発しshort b{a}ます。intに絞られるので、これは理解できますshort

short c{0}しかし、それは私には奇妙に警告を与えません。リテラル整数について覚えていますが、 の型は0少なくとも である必要がありますintintからへの絞り込みshortはここで起こっています。コンパイラが警告を出さないのはなぜですか?

0 投票する
3 に答える
1032 参照

c++ - 強制縮小変換警告

いくつかの縮小変換を示す次のコードを検討してください。

メンバーの本体を変更して、wrapper変換を縮小するためのコンパイラ警告をトリガーする方法は? 私の目標は、コードに問題がある可能性があることをユーザーに認識させることです。

0 投票する
0 に答える
178 参照

c++ - 絞り込み、未評価のコンテキストとテンプレート関数

次のコードを検討してください。

エラーが発生して(予想どおり)コンパイルされません。

{ } 内の 'double' から 'int' への '0.0' の縮小変換

GCCとclangの両方がこれに同意しています。
次に、以下のコードを検討してください。

この場合、clang 3.9 はエラーを返し、GCC 6.2 はエラーなしでコンパイルされます。

関数テンプレートの場合、縮小変換を受け入れなければならない理由はありますか、それとも GCC のエラーですか?


コンパイルに失敗するはずなので、GCC に問題を開くつもりですが、ここで関数テンプレートに関する重要な何かが欠けているかどうかを知りたいです。

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

c++ - 初期化子リストのコンテキストでのナローイングの奇妙な動作

これが警告なしでコンパイルされる理由を誰かが知っていますか

しかし、しません

警告:

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

c++ - 割り当てリストと初期化子リストの間の C++11 でのナローイングの違い

C++11 は初期化リストを提供してくれました。これらは縮小変換を実行しないことを学びました。これにより、既存のコードのコンパイルが中断されることがあります。たとえば、暗黙的に int 拡張された値を使用して列挙値を操作する場合です。

の初期化はtest、キャストなしではコンパイルされません。

私が探しているのは、xまだ機能している割り当ての初期化の背後にある理論的根拠です。

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

typescript - TypeScript の型推論 / 狭小化の課題

現在、既存のコードの型を改善しようとしています。私のコードはおおよそ次のようになります。

メッセージ ハンドラー (where is) に渡されるメッセージの型を明示的に絞り込む必要をなくしたいと思います。/*REMOVE THIS TYPE HINT!*/これにより、一致する型を持つ型に正しく絞り込まれますmessageType(たとえば、 if messageTypeis "ADD_COMMENT"then messagebe AddCommentMessage)。

これが現在不可能な場合は、お知らせください。そうではないという印象を受けましたが、よくわかりません。

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

c++ - 組み込み型のオブジェクトでオーバーフローが発生すると、例外/未定義の動作が発生するのはなぜですか?

私が言えることから、「オーバーフロー」は「ナローイング」と非常によく似ています(完全に同じではないにしても)。

たとえば、値が 255 の unsigned char オブジェクト。そのビット パターンはすべて 1 になります: 1111 1111

したがって、オブジェクトに 1 を追加することによって: char_object++;

一部の一時オブジェクトで拡大が発生し、それに 1 が追加されるため、(一時オブジェクトの) ビット パターンは 256: 0000 0001 0000 0000 になります。

次に、一時オブジェクトが元のオブジェクトにコピー割り当てされ、ナローイング (左端のバイトが失われる) が発生し、値が 0 のままになります。

これがナローイングと同じように機能する場合、一部のマシンでオーバーフローが例外を引き起こすと標準が示唆しているのはなぜですか? 一部の本では、結果として未定義の動作が示唆されています。これは、ナローイングが上記のマシンで同じことを行うことを意味するのではないでしょうか? それらが同じものではない場合、それらはどのように異なるのですか?

(編集 :) おそらく、符号なし 8 ビット オブジェクトのビット パターンと符号付き 8 ビット オブジェクトのビット パターンを比較することによって、これをより明確にすることができますか? 2 の補数では、ビット パターンは変わらないようですが、表現は変わります。とにかく、これはまだ「ナロイングとオーバーフローの違いは何ですか?」という質問に真に答えているわけではありません。それらはまだ同じもののように見えるため: