int16_t上的C ++自动转换为整数

时间:2019-04-12 04:24:28

标签: 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 = mid + static_cast<int16_t>(2);

  int16_t val;
  cin >> val;

  val = std::clamp(val,low,hi);

  return 0;
}

令人惊讶的是,编译器告诉我clamp中存在不匹配,并且lowhighint。如果我将auto更改为int16_t,那么世界上一切都很好,并且所有类型都是预期的int16_t

我要提出的问题是,为什么当所有类型均为auto时,lowhi都将intint16_t转换为decltype这是decltype的好用例吗?

即使在阅读cppreference.com之后,我仍不完全了解sapply的工作原理,所以请原谅我的无知。

2 个答案:

答案 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;
}

ab都是short int,但是当您添加或减去它们时,它们会生成常规的int。这有助于防止溢出,也可以向后兼容。

答案 1 :(得分:5)

此现象称为usual arithmetic conversions。它在C和C ++标准中定义,并且(粗略地说)将小于int的内容转换为int。它也转换较大的类型。花一些时间来阅读它,您会经常需要它。