问题标签 [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 投票
3 回答
950 浏览

c++ - 是否可以在初始化列表中避免 static_cast ?

在我的代码库中,我经常使用以下语法初始化数组或向量 if 字节:

我从 clang++ 收到以下错误:

编译器建议我添加一个 static_cast 来消除错误。我知道演员表会起作用,但我想知道是否有可能避免演员表并保持语法像现在一样优雅?

谢谢您的帮助。

0 投票
3 回答
340 浏览

javascript - 我可以在 TypeScript 中缩小范围吗?

我有一个实用函数来检查变量是否为空或未定义,如果输入变量通过检查,我希望 TypeScript 缩小输入变量的范围,例如:

正如您所看到的,TS 并没有消除字符串存在的可能性,undefined即使该函数在逻辑上使之成为不可能。有没有办法让这个函数调用缩小块input内的范围if

0 投票
1 回答
106 浏览

c++ - C++ / OpenGL:纹理到像素图示例 - 缩小转换错误

我正在尝试将此纹理从 OpenGL 运行到像素图示例并得到以下错误

该错误是指示例的以下代码块:

这个错误的原因是什么?

是编译器还是 c++11 的问题?

有没有办法让我的编译器忽略 -Wnarrowing 或进行安全转换?

0 投票
3 回答
345 浏览

c++ - 如何检测一个类型是否是可列表初始化的?

背景:我正在编写一个类似的包装器类型Either<A, B>,并且我想return {some, args};从一个返回的函数开始工作,Either<A, B>而它恰好可以从一个返回A或的函数工作B。但是,我还想检测两者 A何时和B可以用 初始化{some, args},并产生错误以保护用户免受歧义。

为了检测是否T可以从某些参数初始化类型,我尝试编写如下函数:

我认为表达式testInit<T>(some, args)在有效时应该T{some, args}是有效的——在下面的代码中,初始化auto x = MyType{1UL, 'a'};工作,这个测试也通过了:

但是,当我们从 中添加构造函数时std::initializer_list<char>,它会中断:

note: candidate template ignored: substitution failure [with T = MyType, Args = <unsigned long, char>]: non-constant-expression cannot be narrowed from type 'unsigned long' to 'char' in initializer list

为什么 Clang 拒绝解析我(size_t, char)的构造函数以支持initializer_list构造函数?无论它是聚合类型、用户定义的构造函数还是构造函数,我如何才能正确检测是否return {some, args};会在返回的函数中工作Tinitializer_list

0 投票
2 回答
7855 浏览

c++ - 初始化向量具有 int 值

我想用这个 ASCII 码初始化这个 char 向量:

我在所有 6 个字符中都得到了这个语法错误:

从“int”到“char”的无效缩小转换:常量值不适合目标类型

但是当我使用相同的 ASCII 代码初始化单个 char 变量时:

它工作正常。

所以我意识到在向量中,由于某种原因,char 类型可以接收 int 值,直到 127。从 128 开始出现语法错误。

这与普通变量不同,当 char 类型可以接收任何 int 值时。

我尝试将向量声明为无符号字符,语法错误消失了。

但还是,

为什么 char 类型向量不能接收与 char 类型变量相同的 int 数据?

我真的很感激有人向我解释这种行为。

0 投票
1 回答
1126 浏览

c++ - 从“float”到“int”的无效缩小转换

我正在使用 C++ 的 SFML 图形库。我的编译器是 Visual Studio 2017。

当我做这个功能时,scale我遇到了一个问题。我有一个错误说:

Invalid narrowing conversion from "float" to "int"

所以,我把roundf向量中的两个项目都放在前面,但这似乎没有帮助。更改返回值的std::vector<int>tostd::vector<float>似乎可行,但我希望它是一个整数。有任何想法吗?这是我的代码:

0 投票
1 回答
144 浏览

java - RxJava2 Observables 是协变的吗?或者:缩小 Observable 是否安全(向上转换其值类型)?

给定一个 classFoo和一个 class ,将 an 强制转换为 anBar extends Foo似乎应该是安全的——它们是只读的,不是吗?但似乎没有任何开箱即用的方法可以在没有警告的情况下做到这一点,除了类似的东西Observable<Bar>Observable<Foo>Observables

它编译没有错误,但似乎会产生额外的方法调用开销,除非编译器非常聪明。

其他库(如 vavr.io)具有内置narrow()方法,至少可以为您抑制警告,相当于:

但是 RxJava2 似乎没有提供这样的方法,这让我怀疑我是否遗漏了一些东西,它并没有我想的那么安全。


ETA:作为(相对)干净的map(Foo.class::cast)/cast(Foo.class)看起来,我意识到最好写

因为如果Bar不能强制转换为Foo.

(不过,它对泛型没有帮助;你只会得到一个不安全的强制转换警告。对于泛型,narrow()上面的自定义实现似乎更安全。)

0 投票
4 回答
7125 浏览

c++ - 从 int 到 uint8_t 的隐藏缩小转换

考虑以下代码:

当我尝试编译这个 ( gcc 5.4.0) 时,我收到以下错误:

我真的不明白为什么会有任何缩小。该int类型从未在我的代码中的任何地方使用过,所有内容都是用unsigned chars 编写的。即使我明确地转换为unsigned char我得到错误:

其实要解决这个问题,我需要去掉{}-initialization。然后它工作:

为什么这是必要的?

0 投票
1 回答
54 浏览

c++ - 多字节字符 '\377777' 是如何工作的?

std::numeric_limits<size_t>::max()当我尝试一些非标准的方法来为我寻找时,Clang 向我提到了这个东西allocator::max_size()

表达式大小似乎限制在 4 个字节,所以它看起来很像一个 impl 定义的多字节字符,但我不知道它是如何工作的。

第 2-4 行似乎都返回 int 但只有第 4 行警告-Wfour-char-constants是否打开-Weveryting。为什么 4-byte char 必须警告它的用户?

请解释它是如何工作的。它有任何口语或可能是规范的术语吗?

godbolt.org/g/7AR9nw

0 投票
2 回答
1890 浏览

vb.net - 重载解决失败,因为没有缩小转换就无法调用可访问的“显示”

我一直有关于这个缩小转换错误的问题

重载解析失败,因为没有缩小转换就无法调用可访问的“显示”:

'公共共享函数显示(所有者作为 System.Windows.Forms.IWin32Window,文本作为字符串,标题作为字符串,按钮作为 System.Windows.Forms.MessageBoxButtons)作为 System.Windows.Forms.DialogResult':参数匹配参数'所有者'从“String”缩小到“System.Windows.Forms.IWin32Window”。

'公共共享函数显示(所有者作为 System.Windows.Forms.IWin32Window,文本作为字符串,标题作为字符串,按钮作为 System.Windows.Forms.MessageBoxButtons)作为 System.Windows.Forms.DialogResult':参数匹配参数 'caption'从“Microsoft.VisualBasic.MsgBoxStyle”缩小到“String”。

'公共共享函数显示(所有者作为 System.Windows.Forms.IWin32Window,文本作为字符串,标题作为字符串,按钮作为 System.Windows.Forms.MessageBoxButtons)作为 System.Windows.Forms.DialogResult':参数匹配参数'按钮'从“System.Windows.Forms.MessageBoxIcon”缩小到“System.Windows.Forms.MessageBoxButtons”。

'公共共享函数显示(文本作为字符串,标题作为字符串,按钮作为 System.Windows.Forms.MessageBoxButtons,图标作为 System.Windows.Forms.MessageBoxIcon)作为 System.Windows.Forms.DialogResult':参数匹配参数'按钮'从“Microsoft.VisualBasic.MsgBoxStyle”缩小到“System.Windows.Forms.MessageBoxButtons”。

我做了一些研究,“重载解析失败,因为在没有缩小转换的情况下无法调用任何可访问的''的通用解决方案:”错误是根据 Microsoft 指定 Option Strict Off。我尝试在项目属性中手动更改它,但它似乎不起作用。

这是发生错误的代码:

我还查看了其他几个论坛,他们在其中讨论了此错误,但与“新建”功能特别相关,它们似乎没有帮助。

对此的任何帮助都会很棒!