C++ C++;int16上的自动转换为整数

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

我对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;
}
#包括
#包括
#包括
使用名称空间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;
}