我对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
中存在不匹配,并且low
和high
是int
。如果我将auto
更改为int16_t
,那么世界上一切都很好,并且所有类型都是预期的int16_t
。
我要提出的问题是,为什么当所有类型均为auto
时,low
和hi
都将int
和int16_t
转换为decltype
?这是decltype
的好用例吗?
即使在阅读cppreference.com之后,我仍不完全了解sapply
的工作原理,所以请原谅我的无知。
答案 0 :(得分:20)
这里不是问题auto
。当您减去两个int16_t
值时,结果为int
。我们可以使用this code here进行演示:
#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
和b
都是short int
,但是当您添加或减去它们时,它们会生成常规的int
。这有助于防止溢出,也可以向后兼容。
答案 1 :(得分:5)
此现象称为usual arithmetic conversions。它在C和C ++标准中定义,并且(粗略地说)将小于int
的内容转换为int
。它也转换较大的类型。花一些时间来阅读它,您会经常需要它。