问题标签 [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++ - 缩小、未评估的上下文和模板函数
考虑以下代码:
它不会编译(如预期的那样)并出现错误:
在 { } 内将 '0.0' 从 'double' 缩小到 'int'
GCC 和 clang 都同意这一点。
现在考虑下面的代码:
在这种情况下,clang 3.9 返回一个错误,而 GCC 6.2 编译没有错误。
在函数模板的情况下,是否有任何理由应该接受缩小转换,还是 GCC 的错误?
我将向 GCC 提出一个问题,因为我想它应该无法编译,但我想知道我是否在这里遗漏了一些关于函数模板的重要内容。
c++ - 在初始化列表上下文中缩小的奇怪行为
有人知道为什么编译时没有警告吗
但不
警告:
c++ - 为什么只有在列表初始化的情况下才会出现缩小转换警告?
我有以下代码:
为什么只有在列表初始化使用的情况下才会出现缩小转换警告?
c++ - C++11 中赋值和初始化列表之间的缩小差异
C++11 为我们提供了初始化列表。我了解到这些不会执行缩小转换,这有时会破坏现有代码的编译,例如在对具有隐式 int 扩展值的枚举值进行操作时:
的初始化test
不会在没有演员表的情况下编译。
我正在寻找的是x
仍在工作的分配初始化背后的基本原理。
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.
c++ - 如何在 C++ 中正确定义包含科学记数法的整数向量?
编码
给出错误
然而
印刷
如何正确将此向量定义为整数向量?
如果在写这个问题时发现设置
确实有效,但有更好的方法吗?在 n1 和 n2 的声明中,类型仍然从 double 转换为 int。
c++ - 如何使用 SFINAE 来防止模板函数变窄?
我正在尝试为 Vector 类实现基本算术运算,并希望支持混合底层类型,同时防止发生缩小。
我想实现 is_narrowing_conversion 以便仅在类型不缩小时才允许转换。这里有些例子:
最后,我想编写第二个模板 operator+ 函数,该函数将通过返回一个 Vector 来处理相反的情况。
我发现这篇文章有一个不完整的例子。但这还不够,因为他指出它不允许 uint8_t 到 uint64_t 转换。
我还发现了Daniel Krügler 关于修复 is_constructible 的论文。特别是在本文中,他提到使用列表初始化,它已经具有缩小语义,但我不确定如何将他提到的内容转换为可用于 SFINAE 模板推导的适当特征。
c++ - 为什么内置类型的对象溢出会导致异常/未定义的行为?
据我所知,“溢出”的工作原理非常类似于“缩小”(如果不是完全一样的话)。
例如,一个值为 255 的 unsigned char 对象;它的位模式将全为 1:1111 1111
因此,通过向对象加 1:char_object++;
在一些临时对象上会发生加宽,添加了 1,因此位模式(在临时对象上)应该是 256: 0000 0001 0000 0000
然后将临时对象复制分配到原始对象中,导致变窄(丢失最左边的字节),使其值为 0。
如果这像缩小一样起作用,我很好奇为什么标准建议在某些机器上,溢出会导致异常?有些书甚至建议未定义的行为作为结果。这难道不意味着缩小会在所述机器上做同样的事情吗?如果它们不是同一个东西,那么它们有什么不同呢?
(编辑:)也许通过将无符号 8 位对象的位模式与有符号 8 位对象的位模式进行比较,这可以更清楚吗?似乎在 2 的补码中,位模式不会改变,但表示会改变。无论如何,这仍然不能真正回答这个问题,“缩小和溢出有什么区别?” 因为它们似乎仍然是同一件事: