问题标签 [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至少应该是int. 所以这里发生了从int到缩小。short为什么编译器不发出警告?

0 投票
3 回答
1032 浏览

c++ - 强制缩小转换警告

考虑以下代码,该代码说明了一些缩小转换:

如何更改wrapper成员的主体,使其触发编译器警告以进行缩小转换?我的目标是让用户意识到他们的代码可能有问题。

0 投票
0 回答
178 浏览

c++ - 缩小、未评估的上下文和模板函数

考虑以下代码:

它不会编译(如预期的那样)并出现错误:

在 { } 内将 '0.0' 从 'double' 缩小到 'int'

GCC 和 clang 都同意这一点。
现在考虑下面的代码:

在这种情况下,clang 3.9 返回一个错误,而 GCC 6.2 编译没有错误。

在函数模板的情况下,是否有任何理由应该接受缩小转换,还是 GCC 的错误?


我将向 GCC 提出一个问题,因为我想它应该无法编译,但我想知道我是否在这里遗漏了一些关于函数模板的重要内容。

0 投票
1 回答
682 浏览

c++ - 在初始化列表上下文中缩小的奇怪行为

有人知道为什么编译时没有警告吗

但不

警告:

0 投票
3 回答
1167 浏览

c++ - 为什么只有在列表初始化的情况下才会出现缩小转换警告?

我有以下代码:

为什么只有在列表初始化使用的情况下才会出现缩小转换警告?

0 投票
1 回答
175 浏览

c++ - C++11 中赋值和初始化列表之间的缩小差异

C++11 为我们提供了初始化列表。我了解到这些不会执行缩小转换,这有时会破坏现有代码的编译,例如在对具有隐式 int 扩展值的枚举值进行操作时:

的初始化test不会在没有演员表的情况下编译。

我正在寻找的是x仍在工作的分配初始化背后的基本原理。

0 投票
1 回答
958 浏览

typescript - TypeScript type inference/narrowing challenge

I'm currently trying to improve the types on some existing code. My code looks roughly like this:

I'd like to remove the need to explicitly narrow the type of the message passed to the message handler (where /*REMOVE THIS TYPE HINT!*/ is), such that it correctly narrows to the type that has a matching messageType type (e.g. if messageType is "ADD_COMMENT" then message should be AddCommentMessage).

If this is not possible right now please let me know. I'm under the impression that it isn't but I'm not quite sure.

0 投票
1 回答
594 浏览

c++ - 如何在 C++ 中正确定义包含科学记数法的整数向量?

编码

给出错误

然而

印刷

如何正确将此向量定义为整数向量?

如果在写这个问题时发现设置

确实有效,但有更好的方法吗?在 n1 和 n2 的声明中,类型仍然从 double 转换为 int。

0 投票
3 回答
320 浏览

c++ - 如何使用 SFINAE 来防止模板函数变窄?

我正在尝试为 Vector 类实现基本算术运算,并希望支持混合底层类型,同时防止发生缩小。

我想实现 is_narrowing_conversion 以便仅在类型不缩小时才允许转换。这里有些例子:

最后,我想编写第二个模板 operator+ 函数,该函数将通过返回一个 Vector 来处理相反的情况。

我发现这篇文章有一个不完整的例子。但这还不够,因为他指出它不允许 uint8_t 到 uint64_t 转换。

我还发现了Daniel Krügler 关于修复 is_constructible 的论文。特别是在本文中,他提到使用列表初始化,它已经具有缩小语义,但我不确定如何将他提到的内容转换为可用于 SFINAE 模板推导的适当特征。

0 投票
1 回答
72 浏览

c++ - 为什么内置类型的对象溢出会导致异常/未定义的行为?

据我所知,“溢出”的工作原理非常类似于“缩小”(如果不是完全一样的话)。

例如,一个值为 255 的 unsigned char 对象;它的位模式将全为 1:1111 1111

因此,通过向对象加 1:char_object++;

在一些临时对象上会发生加宽,添加了 1,因此位模式(在临时对象上)应该是 256: 0000 0001 0000 0000

然后将临时对象复制分配到原始对象中,导致变窄(丢失最左边的字节),使其值为 0。

如果这像缩小一样起作用,我很好奇为什么标准建议在某些机器上,溢出会导致异常?有些书甚至建议未定义的行为作为结果。这难道不意味着缩小会在所述机器上做同样的事情吗?如果它们不是同一个东西,那么它们有什么不同呢?

(编辑:)也许通过将无符号 8 位对象的位模式与有符号 8 位对象的位模式进行比较,这可以更清楚吗?似乎在 2 的补码中,位模式不会改变,但表示会改变。无论如何,这仍然不能真正回答这个问题,“缩小和溢出有什么区别?” 因为它们似乎仍然是同一件事: