如何让 C++11 汽车更智能?
how to make c++11 auto smarter?
我现在开始在 c++ 11 中使用 auto 关键字。我发现它不那么聪明的一件事在下面的代码中说明:
unsigned int a = 7;
unsigned int b = 23;
auto c = a - b;
std::cout << c << std::endl;
如您所见,c
变量的类型是无符号的 int。但我的意图是两个无符号 int 的区别应该是 int。所以我预计变量c
等于 -16。 如何更明智地使用 auto,以便它可以将c
变量的类型推断为 int?谢谢。
a
和b
都有一种无符号的 int。因此,表达式的类型a - b
被推导出为无符号 int,c
具有无符号 int的类型。所以这里的自动工作是它应该做的。
如果要将类型从无符号int 更改为int,可以使用static_cast:
auto c = static_cast<int>(a - b);
或者显式指定c
的类型:
int c = a - b;
你误解了unsigned int
类型是什么。
unsigned int
是某些k
(通常为 32)整数的模2^k
。 减去两个这样的 mod-2^k
整数是明确定义的,并且不是有符号整数。
如果需要对从-2^k
到2^k-1
的有界整数集(k 通常等于 31)进行建模的类型,请使用int
而不是unsigned int
。 如果你想让他们是积极的,只需让他们成为积极的。
尽管它的名字,unsigned int
并不是一个没有符号的int
,因此是积极的。 相反,它是一种非常特殊的积分类型,碰巧没有符号的概念。
如果你不需要对一些定义的k
未知实现进行mod-2^k
数学运算,并且不需要将每个数量级的位打包到一个值中,请不要使用unsigned int
。
你似乎想要的是类似的东西
positive<int> a = 7;
positive<int> b = 23;
auto c = a-b; // c is of type `int`, because the difference of two positive values may be negative
通过一些语法更改和大量工作,这可能是可能的,但这不是unsigned
的意思。
所以仅仅因为你不知道基本表达式是如何工作的,C++11 auto 关键字是愚蠢的吗?这对你来说有什么意义?
在表达式auto c = a - b;
中,auto c =
与子表达式a - b
中使用的类型没有任何关系。
从第一个 C 语言草稿开始,表达式使用的类型就由该表达式的操作数决定。从试行标准的K&R C到C++17的所有内容都是如此。
现在,如果你想要负数,你需要做的是,毫不奇怪,使用负类型。在调用-
运算符之前,将操作数更改为(带符号)int
或将其强制转换为该类型。
将结果声明为有符号类型而不更改-
的操作数类型不是一个好主意,因为这样会强制从无符号转换为有符号,这不一定是明确定义的行为。
现在,如果操作数具有不同的类型,或者属于小整数类型,则它们将按照通常的算术转换进行隐式提升。这不适用于此特定情况,因为两个操作数属于同一类型,而不是小整数类型。
但。。。这就是为什么auto
关键字是愚蠢和危险的。考虑:
unsigned short a = 7;
unsigned short b = 23;
auto c = a - b;
由于两个操作数都是无符号的,程序员打算使用无符号算术。但在这里,两个操作数都被隐含地提升为int
,符号发生了意外的变化。auto
关键字假装什么都没发生,而unsigned int c = a - b;
会增加编译器诊断消息的机会,或者至少增加外部静态分析工具发出警告的机会。而且它还会意外地消除原本可能是签名更改的错误。
此外,对于auto
,我们最终会得到声明变量的错误、意外类型。
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 构造智能点数据类型以及普通数据类型的通用方法
- 编译器不会使用 -std=c++11 编译智能指针
- 为什么C++不支持对未初始化变量进行智能分析?
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 如何让 C++11 汽车更智能?