C++ C++;int16上的自动转换为整数
我对C++17非常陌生,我试图理解C++ C++;int16上的自动转换为整数,c++,c++17,auto,decltype,C++,C++17,Auto,Decltype,我对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
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;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
int16_t mid=4;
自动低=中等静态(2);
自动高=中+静态(2);
国际16日;
cin>>val;
val=标准::夹具(val,低,高);
返回0;
}
令人惊讶的是,编译器告诉我clamp
中存在不匹配,low
和high
是int
。如果我将auto
更改为int16\u t
,世界上一切都很好,所有类型都是int16\u t
我提出的问题是,为什么auto
将low
和hi
转换为int
,当所有类型都是int16\u t
时?这是decltype
的一个很好的用例吗
即使阅读了cppreference.com,我也不完全理解
decltype
的工作原理,请原谅我的无知。这里的问题不在于auto
。当您减去两个int16\t
值时,结果是int
。我们可以通过以下方式来证明这一点:
#包括
#包括
使用名称空间std;
模板
无效打印类型(T){
Std::CUT< P>这个现象被称为.C和C++标准中定义的(粗略地说),将比 INT/CUT>小的任何东西转换成<代码> int 。它也会转换较大的类型。花些时间阅读它,你会经常需要它。你确实可以使用<代码> DeCype(MID)low=mid-…
或强制转换整个表达式auto low=static_cast(mid-…)
可能重复的。。。
#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;
}