int16_t上的C ++ auto转换为整数

问题描述 投票:19回答:2

我是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时,为什么lowhiint投射到int16_t?这是decltype的一个很好的用例吗?

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

c++ c++17 auto decltype
2个回答
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 ints,但是当你加或减时它会产生一个常规的int。这有助于防止溢出/并且也是为了向后兼容。


5
投票

这种现象称为usual arithmetic conversions。它在C和C ++标准中定义,并且(粗略地说)将任何小于int的东西转换为int。它也可以转换更大的类型。花点时间阅读一下,你会经常需要它。

© www.soinside.com 2019 - 2024. All rights reserved.