c++ - C++ auto on int16_t 强制转换为整数
问题描述
我对 C++17 还是很陌生,我正在尝试理解decltype
关键字以及它如何与auto
.
下面是产生意外结果的代码片段。
#include <typeinfo>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int16_t mid = 4;
auto low = mid - static_cast<int16_t>(2);
auto hi = mid + static_cast<int16_t>(2);
int16_t val;
cin >> val;
val = std::clamp(val,low,hi);
return 0;
}
令人惊讶的是,编译器告诉我clamp
and thatlow
和high
are不匹配int
。如果我更改auto
为int16_t
世界上的一切都很好,并且所有类型都int16_t
符合预期。
我提出的问题是,为什么auto
castlow
和hi
to int
when all types are int16_t
?这是一个很好的用例decltype
吗?
即使在阅读 cppreference.com 之后,我也不完全了解它是如何decltype
工作的,所以请原谅我的无知。
解决方案
问题不在auto
这里。当您减去两个int16_t
值时,结果是int
. 我们可以在这里用这段代码演示它:
#include <iostream>
#include <cstdint>
using namespace std;
template<class T>
void print_type(T) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
int16_t a = 10;
int16_t b = 20;
print_type(a);
print_type(b);
print_type(a - b);
return 0;
}
a
andb
都是short int
s,但是当你添加或减去它们时,它会产生一个常规的int
. 这是为了防止溢出 / 也是为了向后兼容。
推荐阅读
- c# - HttpClient的请求头和内容头有什么区别
- javascript - 使用 Tailwind CSS 使用来自 `@headlessui/react` 的`Transition` 创建自上而下的幻灯片动画
- javascript - 使用 sort() 按名称对数组进行排序
- python - django updateview表单相关模型
- android - 在android中使用firebase身份验证插入和检索登录用户的数据
- asp.net-core - AutomaticAuthenticate for ASP.NET IdentityServer4 on open routes?
- javascript - 这个非常规的 Javascript 代码是如何在浏览器控制台中构建和打印 hello world 警报的?
- mysql - how does this work when the column which is there in select but not there in group
- feathersjs - 如何在 feathersjs 应用程序中从命令行运行任务?
- c - 不能让 printf 高兴。拒绝“i”和“l”的格式字符串