C++中如何编写int16_t类型的字面常量?
问题
在使用std::max或std::min时,如果传入字面常量和int16_t变量,编译器会报错:
error: no matching function for call to 'min(int16_t&, int)'
示例代码:
int16_t my_var {100}; std::cout << std::min( my_var, 1 );
已知以下几种写法可解决问题,但都略显繁琐:
std::min<int16_t>( my_var, 1 );std::min( my_var, int16_t( 1 ) );std::min( static_cast<int>( my_var ), 1 );
想知道是否存在编写int16_t类型字面常量的方法,期望能像处理其他整数类型那样简化写法:
std::min( my_var, 1i ); // 或者 std::min( my_var, 1s );
就像处理其他整数类型时的常规写法:
std::min( ulong_var, 1u ); std::min( ll_var, 1ll );
解答
C++标准并没有提供原生的int16_t字面量后缀(比如1i或1s这类),标准仅定义了u/U(无符号型)、l/L(长整型)、ll/LL(长长整型)等基础整数类型的后缀。
如果想要类似的简化写法,可以自定义用户字面量实现:
#include <cstdint> constexpr int16_t operator""_s(unsigned long long n) noexcept { return static_cast<int16_t>(n); }
之后就可以这样使用:
int16_t my_var {100}; std::cout << std::min( my_var, 1_s );
注意自定义字面量的后缀不要用单个i或s(这类属于标准预留后缀范围,可能和未来标准扩展冲突),推荐加上下划线区分,比如_s或_i16。
如果不想自定义字面量,也可以用std::int16_t{1}这种初始化方式,比int16_t(1)稍微简洁一点,但本质还是显式类型转换。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

