问题标签 [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 回答
259 浏览

typescript - if/else 分支没有缩小条件类型

我正在尝试编写一个带有回调的函数,其参数类型取决于非回调函数的参数参数。

我尝试推断使用typeofwhich 为分支中的新声明正确缩小但不缩小回调的类型。

由于typeof arg已经明显缩小到"Foo"我希望callbackArg正确地缩小到"One"分支内,就像它对新声明(如two)所做的那样。

我正在使用 Typescript 3.5.2。

0 投票
1 回答
263 浏览

c++ - 缩小从 char 到 double 的转换

为什么会有警告

缩小从 char 到 double 的转换

我已经知道对于 const char 不会有警告。对此有很多答案。但我想知道,为什么非 const char 有一个“可能狭窄”的警告?

是否有可能在某些系统上尾数不大,无法完美代表字符?

4:13:警告:在 {} [-Wnarrowing] 内缩小从 'char' 到 'double' 的 'c' 转换

0 投票
1 回答
179 浏览

c++ - 为什么 const int 对 char 大括号 init 很好?

我认为大括号初始化不允许缩小。但是为什么int const允许char大括号初始化呢?

在 Godbolt 上看到它。

0 投票
1 回答
56 浏览

c++ - 名称中带有空格的临时类型的统一初始化的正确语法,如 unsigned int

我试图将 T 类型的 x 传递给foo期望的函数,unsigned int但我不确定 T 是什么,因为它是在其他模块中声明的 typedef。两者都不是我可以修改的fooT如果发生缩小,我希望编译器警告我。所以我正在尝试:

不幸的是,在 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 等)怎么办?

0 投票
1 回答
52 浏览

vb.net - 有没有更简单的方法来处理基本类型列表

我有一个基类列表,List(Of Person)其中包含子类Employee和变量Manager

我想调用SetName列表中的每个人,但 vb.net 没有选择最窄的重载SetName函数。有没有办法自动选择最窄的SetName函数?这是我的示例代码

列表中的每个人都以“Person Jim”结尾,但我希望第一个Employee是“员工 Bob”,第二个Manager是“经理 Tom”

这是最干净的方法吗?这是我能想到的唯一方法。在我的情况下这会变得混乱,因为我有大约 20 个派生类而不是 2 个。

编辑:我想我没有让我的需求更清楚。Setname 只是为了代表任何需要列表中的窄类型而不是基类的函数。实际名称并不重要。也许我应该使用一个函数实际上与员工 ID 和经理 ID 混淆的示例。抱歉没有更清楚。

0 投票
2 回答
135 浏览

c++ - 如果可以进行缩小转换,则强制转换和失败编译

为了防止“意外问题”,使用格式指定在其他模块中定义类型的位置,我正在寻找一个转换运算符,它在缩小转换时将无法编译:这表示需要解决的基本类型错误。

例如,在最近从兼容类型更改为不兼容类型的某些外部标头中使用:

目标是让它失败(错误不是警告作为错误),因为结果用作"%d.

(在这种情况下,棘手的缩小问题应该通过额外的代码更改来处理。)

0 投票
3 回答
84 浏览

c++ - 为什么将显式构造视为(隐式)缩小转换?

考虑以下代码:

它被认为是一种缩小转换,编译器觉得有必要警告我(GCC 9)甚至声明一个错误(clang 9):GodBolt

我的问题:

  1. 为什么uint32_t { x }不那么明确static_cast<uint32_t>(x)
  2. 为什么使用 clang 比使用 GCC 更严重,值得一个错误?
0 投票
2 回答
501 浏览

c++ - g ++编译器中奇怪的缩小转换双浮点警告

我有这个函数用于从极坐标符号中创建一个向量,其中使用了大括号初始值设定项:

在 MSVS 中一切似乎都很好,但 g++ 编译器显示的警告对我来说似乎很奇怪:

如果我使用构造函数警告消失:

为什么会出现此警告?这是否意味着编译后的程序会进行不必要的floattodouble和 back to转换float

更新 这是最小的可重现示例

输出g++ test.cpp -o test

所以使用std::cos做帮助。但主要问题仍然存在(并且困扰我) - 为什么警告仅在使用支撑初始化时出现?

0 投票
1 回答
3700 浏览

c++ - 缩小从 int 到 unsigned char 的转换

当我尝试编译这段代码时

我收到此错误:

错误:在 { } [-Wnarrowing]| 内将 '(((int)a) + ((int)b))' 从 'int' 缩小到 'unsigned char' 的转换范围缩小

谁能解释我为什么?

0 投票
2 回答
2365 浏览

c++ - 缩小转换

我想知道为什么我会收到此检查/警告/提示

Clang-Tidy:从“int”缩小到有符号类型“char”的转换是实现定义的

我在那里做的唯一一件事就是获取字符并“大写”它,以防它还没有,所以我不必在我的开关上处理 2 个案例。有谁知道我必须改变什么才能摆脱这个,所以我会把它完全绿色化,因为这是唯一的问题?看来我缺乏一些关于转换的知识。

谢谢!

打印屏幕