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

c++11 - gcc 是否错误不能诊断非类型模板参数中的缩小转换?

以下程序使用 gcc 4.8.1 编译没有错误或警告, -Wall -std=c++11

具有相同选项的 clang 3.3 会出现此错误:

错误:非类型模板参数的计算结果为 -1,不能将其缩小为类型 'unsigned int' [-Wc++11-narrowing]

根据这个问题,看起来 gcc 的当前政策只是在标准指示错误和 clang 给出指示错误的地方对缩小转换发出警告。但在这种情况下 gcc 甚至没有给出警告。

标准在第 8.5.4/7 节(在那个问题中重现)给出的缩小转换错误的例子都没有涵盖非类型模板参数的缩小转换的情况,但在第 14.3.2/5 节标准说:

对于整数或枚举类型的非类型模板参数,应用转换后的常量表达式 (5.19) 中允许的转换。

§ 5.19/3 说:

T 类型的已转换常量表达式是一个字面常量表达式,隐式转换为 T 类型,其中在字面常量表达式中允许隐式转换(如果有),并且隐式转换序列仅包含用户定义的转换,左值到-右值转换 (4.1)、整数提升 (4.5) 和除窄转换(8.5.4) 之外的整数转换 (4.7)

(我的重点)。

在我看来,这似乎意味着即使按照自己的标准 gcc 在这种情况下根本没有诊断出缩小转换是错误的。我读对了吗?是否有基于标准的反驳?

我问这个问题的感觉不仅仅是好奇。在递归 TMP 设置中,clang 的错误诊断在这种情况下将查明一个错误,其中无符号的非类型模板参数低于 0,而您从 gcc 得到的只是“超出了最大模板实例化深度”。

0 投票
1 回答
173 浏览

java - 原始数据类型一些问题

我正在学习 Java,并且有一些不清楚的问题,如果有人可以提供帮助,我将非常高兴。

第一个问题

int 的近似值为:2.147.483,647

long 的近似值为:9,223,372,036,854,775,807

这个网站说:

“如果整数文字以字母 L 或 l 结尾,则其为 long 类型;否则为 int 类型”

这意味着如果我没有在变量名的末尾添加字母 L/l

如 :

所以变量num被认为是int类型而不是长类型。

所以我做了这个程序:

这是输出:

int 的近似值是:2,147,483,647 并且变量 max 是 int,那么它是如何打印粗体值的呢?

第二个问题:

关于缩小转化范围:

我的说法是真的吗?

byte 类型(8 位)和 short 类型(16 位)只能在 byte/short 类型上找到的值是以下值之一的情况下转换为 char 类型(16 位):0,1,2,3,4 ,5,6,7,8,9 否则会出现运行时错误

- 第三个也是最后一个问题:

当我声明数字变量类型时,例如:

如果字母符号化我也可以声明其他类型的变量使用它们的第一个字母吗?为什么要包含它 num1 到 num2 和 num3 到 num4 有什么区别?

0 投票
4 回答
803 浏览

c++ - 浮动到双重误解???克++

出于某种原因,我收到以下警告

这听起来像是在尝试使用“double cos(double)”等而不是“float cos(float)”等。我一直在尝试想更多的方法来向编译器提出这个建议,但没有得到任何结果。我能做些什么来解决这个问题?

谢谢


编辑:将其更改为此会使警告消失,但我仍然想知道问题出在哪里

0 投票
2 回答
604 浏览

c++ - 为什么 `bool b = 2` 运行良好但 `bool b = {2}` 会产生缩小转换的警告?

使用{}初始化程序 inC++11进行初始化会bool b = {2}产生以下警告消息:

但是,使用旧样式bool b = 2没有这样的问题。这背后的原因是什么?


更新:我使用它编译了代码g++ -std=c++11,它给了我警告。如果我添加 option -pedantic-errors,警告将变为错误。

0 投票
1 回答
5761 浏览

c++ - G ++警告:缩小转换

我正在尝试从 sourceforge 编译 hosts3d,它确实可以编译,但会产生几个缩小错误。我不知道如何解决这个问题,但任何帮助将不胜感激。我怀疑我可以下载以前版本的编译器,我可能最终会这样做,但现在...... c++11

g++ -Wall -O2 -c -o src/glwin.o src/glwin.cpp src/glwin.cpp: 在成员函数'int MyGLWin::AddInput(int, int, unsigned int, int, const char*, bool) ':src/glwin.cpp:983:147:警告:在 C++11 [-Wnarrowing] glin_obj glin = {GLWIN_INPUT , lastWin, lower, names++, left, top, cwidth, strlen(text), (strlen(text) > cwidth ? strlen(text) - cwidth : 0), max};

0 投票
3 回答
282 浏览

c++ - 为什么下面的表达式表征缩小转换?

此表达式可在标准 (N3797) §8.5.4/7 中的示例中找到

鉴于§8.5.4/7 及其第 4 个要点:

缩小转换是一种隐式转换:

  • 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,其值在整数提升后将适合目标类型。

我想说这里没有缩小范围,因为 -1 是一个常量表达式,它在积分提升后的值适合一个无符号整数。

另请参阅关于Integral Promotion的 §4.5/1 :

如果 int 可以表示源类型的所有值,则可以将除 bool、char16_t、char32_t 或 wchar_t 的整数转换等级 (4.13) 小于 int 等级的整数类型的纯右值转换为 int 类型的纯右值; 否则,可以将源纯右值转换为 unsigned int 类型的纯右值。

从 4.13 开始,我们得到 -1(一个 int)的秩等于一个 unsigned int 的秩,因此它可以转换为一个 unsigned int。

编辑

不幸的是, Jerry Coffin从这个帖子中删除了他的答案。我相信他走在正确的轨道上,如果我们接受这样一个事实,即在标准发生这种变化之后,目前对第 8.5.4/7 节第 4 条要点的解读是错误的。

0 投票
0 回答
1585 浏览

c++ - C++11:缩小

我在 PDF 中阅读了以下段落:http: //www.stroustrup.com/what-is-2009.pdf

收窄

也许您注意到我一直使用 {} 初始化。或许,你也认为我在丑化代码,对一个新奇的功能过分迷恋?当然,这种情况会发生,但我认为情况并非如此。考虑:

我们可以就这两个定义的美学进行友好的讨论,您甚至可以指出 {} 版本比 = 需要多一次击键。但是,这两种形式之间存在一个显着差异,使我选择了 {}。{} 版本不允许缩小范围,我没有告诉您这两个定义是为具有 16 位整数的机器编写的。这意味着 x1 的值可能非常令人惊讶,而 x2 的定义会导致编译时错误。

但是当我尝试使用 'Ideone.com' c++11 在线编译器编译以下内容时,它显示成功

我期待编译错误。任何形式的帮助将不胜感激。

0 投票
0 回答
1637 浏览

c++ - 缩小从“int”到“double”的转换和数组初始化

以下

给出 a 的错误(在 clang 中)或警告(在 gcc 中)narrowing conversion from 'int' to 'double'。我发现这真的很窄,至少在我看到从 unsigned 到 double 的缩小转换之前,我感到很惊讶。

我的实际问题源于一个包含数组的类,并以最简单的方式(转发)提供用于指定数组元素的构造函数:

在这种情况下,我们有以下(现场示例):

其中ERROR指的是上面讨论的缩小转换。我怀疑所有这些错误都归结为开头提到的错误(double d{i};)。是这样吗?否则,会发生什么?

无论如何,我真的很想

工作,完全一样

作品。不幸的是,我只能使用初始化列表来初始化数组,该列表还检查缩小转换。我知道一种解决方法是在构造函数中进行显式转换:

或(感谢马克)

但这是“正确”的方式吗?它是最有效的,什么时候E是“大”类型?

0 投票
1 回答
1335 浏览

filter - Django haystack在字段之间使用OR运算符缩小

我搜索一下。我按字段 A 缩小范围。我按字段 B 缩小范围。我得到的结果包括粗麻布和麻袋。我想要的是获得包括粗麻布或麻袋的结果。

您可以使用以下方法进行一定程度的 OR 缩小:

但是你最终还是会得到粗麻布和麻袋的结果。此方法的替代方法如下,但它并不理想,因为它在大型数据集上似乎很慢:

当你需要他的时候,丹尼尔林赛在哪里?

0 投票
5 回答
2038 浏览

java - 什么是缩小java中的类型转换?

根据我在 Java 中的知识,在缩小类型转换时,如果源中的任何常量都在字节范围内,则允许:

但是当我输入这个时:

为什么这样 ?您能否说出这些缩小转换在 Java 中发生的确切规则。