【发布时间】:2019-09-02 19:07:31
【问题描述】:
我是 C++17 的新手,我正在尝试理解 decltype 关键字以及它如何与 auto 配对。
下面是一段产生意外结果的sn-p代码。
#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 不匹配,而low 和high 是int。如果我将auto 更改为int16_t,世界上一切都很好,所有类型都是int16_t,正如预期的那样。
我提出的问题是,当所有类型都是int16_t 时,为什么auto 将low 和hi 转换为int? 这是一个很好的用途decltype 的情况?
即使在阅读 cppreference.com 之后,我也无法完全理解 decltype 的工作原理,请原谅我的无知。
【问题讨论】:
-
您确实可以使用
decltype(mid) low = mid - ...或转换整个表达式auto low = static_cast<int16_t>(mid - ...)