首页 > 解决方案 > 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;
}

令人惊讶的是,编译器告诉我clampand thatlowhighare不匹配int。如果我更改autoint16_t世界上的一切都很好,并且所有类型都int16_t符合预期。

我提出的问题是,为什么autocastlowhito intwhen all types are int16_t这是一个很好的用例decltype吗?

即使在阅读 cppreference.com 之后,我也不完全了解它是如何decltype工作的,所以请原谅我的无知。

标签: c++c++17autodecltype

解决方案


问题不在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;
}

aandb都是short ints,但是当你添加或减去它们时,它会产生一个常规的int. 这是为了防止溢出 / 也是为了向后兼容。


推荐阅读