问题标签 [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.
typescript - if/else 分支没有缩小条件类型
我正在尝试编写一个带有回调的函数,其参数类型取决于非回调函数的参数参数。
我尝试推断使用typeof
which 为分支中的新声明正确缩小但不缩小回调的类型。
由于typeof arg
已经明显缩小到"Foo"
我希望callbackArg
正确地缩小到"One"
分支内,就像它对新声明(如two
)所做的那样。
我正在使用 Typescript 3.5.2。
c++ - 缩小从 char 到 double 的转换
为什么会有警告
缩小从 char 到 double 的转换
我已经知道对于 const char 不会有警告。对此有很多答案。但我想知道,为什么非 const char 有一个“可能狭窄”的警告?
是否有可能在某些系统上尾数不大,无法完美代表字符?
4:13:警告:在 {} [-Wnarrowing] 内缩小从 'char' 到 'double' 的 'c' 转换
c++ - 为什么 const int 对 char 大括号 init 很好?
我认为大括号初始化不允许缩小。但是为什么int const
允许char
大括号初始化呢?
在 Godbolt 上看到它。
c++ - 名称中带有空格的临时类型的统一初始化的正确语法,如 unsigned int
我试图将 T 类型的 x 传递给foo
期望的函数,unsigned int
但我不确定 T 是什么,因为它是在其他模块中声明的 typedef。两者都不是我可以修改的foo
。T
如果发生缩小,我希望编译器警告我。所以我正在尝试:
不幸的是,在 gcc 9.2 上。这给了我一个编译错误:
如果我将违规行更改为:
然后问题就消失了,我得到了一个正确的警告,表明发生了缩小:
伟大的!不幸的是,这种语法在 Visual Studio 2019 16.2.5 上不起作用,因为我得到:E0029 C4576 C2397 错误在这一行。其中 C4576 是“带括号的类型后跟初始化列表是一种非标准的显式类型转换语法”。
那么这种情况下的标准显式类型转换语法是什么? https://en.cppreference.com/w/cpp/language/explicit_cast在第 5 点)说它必须是单字类型。如果超过一个字(long long、unsigned long int 等)怎么办?
vb.net - 有没有更简单的方法来处理基本类型列表
我有一个基类列表,List(Of Person)
其中包含子类Employee
和变量Manager
我想调用SetName
列表中的每个人,但 vb.net 没有选择最窄的重载SetName
函数。有没有办法自动选择最窄的SetName
函数?这是我的示例代码
列表中的每个人都以“Person Jim”结尾,但我希望第一个Employee
是“员工 Bob”,第二个Manager
是“经理 Tom”
这是最干净的方法吗?这是我能想到的唯一方法。在我的情况下这会变得混乱,因为我有大约 20 个派生类而不是 2 个。
编辑:我想我没有让我的需求更清楚。Setname 只是为了代表任何需要列表中的窄类型而不是基类的函数。实际名称并不重要。也许我应该使用一个函数实际上与员工 ID 和经理 ID 混淆的示例。抱歉没有更清楚。
c++ - 如果可以进行缩小转换,则强制转换和失败编译
为了防止“意外问题”,使用格式指定在其他模块中定义类型的位置,我正在寻找一个转换运算符,它在缩小转换时将无法编译:这表示需要解决的基本类型错误。
例如,在最近从兼容类型更改为不兼容类型的某些外部标头中使用:
目标是让它失败(错误不是警告作为错误),因为结果用作"%d
.
(在这种情况下,棘手的缩小问题应该通过额外的代码更改来处理。)
c++ - 为什么将显式构造视为(隐式)缩小转换?
考虑以下代码:
它被认为是一种缩小转换,编译器觉得有必要警告我(GCC 9)甚至声明一个错误(clang 9):GodBolt。
我的问题:
- 为什么
uint32_t { x }
不那么明确static_cast<uint32_t>(x)
? - 为什么使用 clang 比使用 GCC 更严重,值得一个错误?
c++ - g ++编译器中奇怪的缩小转换双浮点警告
我有这个函数用于从极坐标符号中创建一个向量,其中使用了大括号初始值设定项:
在 MSVS 中一切似乎都很好,但 g++ 编译器显示的警告对我来说似乎很奇怪:
如果我使用构造函数警告消失:
为什么会出现此警告?这是否意味着编译后的程序会进行不必要的float
todouble
和 back to转换float
?
更新 这是最小的可重现示例
输出g++ test.cpp -o test
:
所以使用std::cos
做帮助。但主要问题仍然存在(并且困扰我) - 为什么警告仅在使用支撑初始化时出现?
c++ - 缩小从 int 到 unsigned char 的转换
当我尝试编译这段代码时
我收到此错误:
错误:在 { } [-Wnarrowing]| 内将 '(((int)a) + ((int)b))' 从 'int' 缩小到 'unsigned char' 的转换范围缩小
谁能解释我为什么?
c++ - 缩小转换
我想知道为什么我会收到此检查/警告/提示
Clang-Tidy:从“int”缩小到有符号类型“char”的转换是实现定义的
我在那里做的唯一一件事就是获取字符并“大写”它,以防它还没有,所以我不必在我的开关上处理 2 个案例。有谁知道我必须改变什么才能摆脱这个,所以我会把它完全绿色化,因为这是唯一的问题?看来我缺乏一些关于转换的知识。
谢谢!