草庐IT

Narrowing

全部标签

[TS手册学习] 02_类型收窄 Narrowing

TS官方手册:TypeScript:Handbook-TheTypeScriptHandbook(typescriptlang.org)一个变量如果声明为联合类型,而后续操作需要针对其具体的单一类型做不同处理,这个过程就叫做类型收窄(Narrowing)。常见的做法或情形有以下:typeof类型保护(typeguards)typeof是JS中的操作符,需要注意typeof对象、数组、null都会返回object。真值收窄(Truthinessnarrowing)0,NaN,"",0n,null,undefined都会被隐式转换为false,属于假值,其它的值是真值。依据这个规则也可以收窄类型。

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

这个表达式可以在标准(N3797)的§8.5.4/7的例子中找到unsignedintui1={-1};//error:narrows鉴于§8.5.4/7及其第4个要点:Anarrowingconversionisanimplicitconversion:fromanintegertypeorunscopedenumerationtypetoanintegertypethatcannotrepresentallthevaluesoftheoriginaltype,exceptwherethesourceisaconstantexpressionwhosevalueafterintegr

c++ - 错误 83 错误 C2398 : conversion from 'double' to 'float' requires a narrowing conversion

我找到了很多关于这个错误的帖子,但我可以找到克服它的方法。这是触发错误的代码:voidmain(){floatf{1.3};}为什么在初始化列表中没有像其他变量那样发生转换?例如,这工作顺利:floatf=1.3; 最佳答案 您评论说使用1.3会导致您的编译器出错。这意味着您发现了一个编译器错误。标准很清楚这不是缩小转换,因此应该允许。引用N4140(大致为C++14):8.5.4List-initialization[dcl.init.list]7Anarrowingconversionisanimplicitconversion

c++ - 为什么只有在列表初始化的情况下才会出现缩小转换警告?

我有以下代码:classA{public:A(constunsignedintval):value(val){}unsignedintvalue;};intmain(){intval=42;Aa(val);Ab{val};//为什么只有在列表初始化使用的情况下才会出现缩小转换警告? 最佳答案 listinitialization自C++11开始引入,具有禁止内置类型之间的隐式缩小转换的功能。同时,另外两种使用括号和等号的“老式”(C++98起)初始化形式intval=42;Aa(val);Aa=val;不要改变它们的行为以符合列表初

c++ - 为什么只有在列表初始化的情况下才会出现缩小转换警告?

我有以下代码:classA{public:A(constunsignedintval):value(val){}unsignedintvalue;};intmain(){intval=42;Aa(val);Ab{val};//为什么只有在列表初始化使用的情况下才会出现缩小转换警告? 最佳答案 listinitialization自C++11开始引入,具有禁止内置类型之间的隐式缩小转换的功能。同时,另外两种使用括号和等号的“老式”(C++98起)初始化形式intval=42;Aa(val);Aa=val;不要改变它们的行为以符合列表初

c++ - 不一致的警告 "conversion from ' const unsigned char' to 'const float' requires a narrowing conversion”

VisualC++2017和gcc5.4产生conversionfrom'constunsignedchar'to'constfloat'requiresanarrowingconversion警告LineB但没有此代码段中的A行:#includeintmain(){constunsignedcharp=13;constfloatq=p;//LineAstd::cout这个警告有效吗?为什么LineB的处理方式与LineA不同? 最佳答案 警告有效,来自C++11narrowingconversions在aggregateiniti

c++ - "Narrowing conversion from ' int ' to ' char ' inside { }"交叉编译时的合法值

我有一个C++项目,我在我的机器上使用g++编译(编译到“主机”)和使用交叉编译器的ARM处理器(在我的例子中是arm-cortex_a8-linux-gnueabi-g++)。我正在转换为C++0x/11标准,编译初始化列表时出现错误,我可以在以下代码段中重现该错误:intmain(void){charc[1]={-108};}这个程序看起来是正确的,因为-108是char的合法值。使用g++编译它不会产生以下命令行错误:g++example.cc-std=c++0x但是,当我使用交叉编译器进行编译时,如下所示:arm-cortex_a8-linux-gnueabi-g++examp
12