C+中的固定宽度整数文本+;? C++ 11首先介绍了通过用户定义的文字来定义新的文字到C++的支持。C++11或更高版本是否也为中类型的固定宽度整数文本预定义后缀?否。从C++14开始,标准中定义的唯一文本后缀由标准库中的、和标题提供。标题定义了h、min、s、ms、us、ns时间段后缀、定义了i、il和if虚数后缀,和定义基本字符串的s后缀

C+中的固定宽度整数文本+;? C++ 11首先介绍了通过用户定义的文字来定义新的文字到C++的支持。C++11或更高版本是否也为中类型的固定宽度整数文本预定义后缀?否。从C++14开始,标准中定义的唯一文本后缀由标准库中的、和标题提供。标题定义了h、min、s、ms、us、ns时间段后缀、定义了i、il和if虚数后缀,和定义基本字符串的s后缀,c++,c++11,language-lawyer,c++14,user-defined-literals,C++,C++11,Language Lawyer,C++14,User Defined Literals,但是,可以很容易地定义自己的固定宽度文字,如下所示: #include <cstdint> constexpr std::int8_t operator "" _int8(unsigned long long v) { return static_cast<std::int8_t>(v); } constexpr std::uint8_t operator "" _uint8(unsigned long long v) { return static_cast<

但是,可以很容易地定义自己的固定宽度文字,如下所示:

#include <cstdint>

constexpr std::int8_t operator "" _int8(unsigned long long v)
{ return static_cast<std::int8_t>(v); }

constexpr std::uint8_t operator "" _uint8(unsigned long long v)
{ return static_cast<std::uint8_t>(v); }

constexpr std::int16_t operator "" _int16(unsigned long long v)
{ return static_cast<std::int16_t>(v); }

constexpr std::uint16_t operator "" _uint16(unsigned long long v)
{ return static_cast<std::uint16_t>(v); }

constexpr std::int32_t operator "" _int32(unsigned long long v)
{ return static_cast<std::int32_t>(v); }

constexpr std::uint32_t operator "" _uint32(unsigned long long v)
{ return static_cast<std::uint32_t>(v); }

constexpr std::int64_t operator "" _int64(unsigned long long v)
{ return static_cast<std::int64_t>(v); }

constexpr std::uint64_t operator "" _uint64(unsigned long long v)
{ return static_cast<std::uint64_t>(v); }

constexpr std::int_fast8_t operator "" _int_fast8(unsigned long long v)
{ return static_cast<std::int_fast8_t>(v); }

constexpr std::uint_fast8_t operator "" _uint_fast8(unsigned long long v)
{ return static_cast<std::uint_fast8_t>(v); }

constexpr std::int_fast16_t operator "" _int_fast16(unsigned long long v)
{ return static_cast<std::int_fast16_t>(v); }

constexpr std::uint_fast16_t operator "" _uint_fast16(unsigned long long v)
{ return static_cast<std::uint_fast16_t>(v); }

constexpr std::int_fast32_t operator "" _int_fast32(unsigned long long v)
{ return static_cast<std::int_fast32_t>(v); }

constexpr std::uint_fast32_t operator "" _uint_fast32(unsigned long long v)
{ return static_cast<std::uint_fast32_t>(v); }

constexpr std::int_fast64_t operator "" _int_fast64(unsigned long long v)
{ return static_cast<std::int_fast64_t>(v); }

constexpr std::uint_fast64_t operator "" _uint_fast64(unsigned long long v)
{ return static_cast<std::uint_fast64_t>(v); }

constexpr std::int_least8_t operator "" _int_least8(unsigned long long v)
{ return static_cast<std::int_least8_t>(v); }

constexpr std::uint_least8_t operator "" _uint_least8(unsigned long long v)
{ return static_cast<std::uint_least8_t>(v); }

constexpr std::int_least16_t operator "" _int_least16(unsigned long long v)
{ return static_cast<std::int_least16_t>(v); }

constexpr std::uint_least16_t operator "" _uint_least16(unsigned long long v)
{ return static_cast<std::uint_least16_t>(v); }

constexpr std::int_least32_t operator "" _int_least32(unsigned long long v)
{ return static_cast<std::int_least32_t>(v); }

constexpr std::uint_least32_t operator "" _uint_least32(unsigned long long v)
{ return static_cast<std::uint_least32_t>(v); }

constexpr std::int_least64_t operator "" _int_least64(unsigned long long v)
{ return static_cast<std::int_least64_t>(v); }

constexpr std::uint_least64_t operator "" _uint_least64(unsigned long long v)
{ return static_cast<std::uint_least64_t>(v); }

constexpr std::intmax_t operator "" _intmax(unsigned long long v)
{ return static_cast<std::intmax_t>(v); }

constexpr std::uintmax_t operator "" _uintmax(unsigned long long v)
{ return static_cast<std::uintmax_t>(v); }

constexpr std::intptr_t operator "" _intptr(unsigned long long v)
{ return static_cast<std::intptr_t>(v); }

constexpr std::uintptr_t operator "" _uintptr(unsigned long long v)
{ return static_cast<std::uintptr_t>(v); }
#包括
constexpr std::int8\u t运算符“”\u int8(无符号长v)
{返回静态_cast(v);}
constexpr std::uint8\u t运算符“”\u uint8(无符号长v)
{返回静态_cast(v);}
constexpr std::int16\u t运算符“”\u int16(无符号长v)
{返回静态_cast(v);}
constexpr std::uint16\u t运算符“”\u uint16(无符号长v)
{返回静态_cast(v);}
constexpr std::int32_t运算符“”\u int32(无符号长v)
{返回静态_cast(v);}
constexpr std::uint32\u t运算符“”\u uint32(无符号长v)
{返回静态_cast(v);}
constexpr std::int64\u t运算符“”\u int64(无符号长v)
{返回静态_cast(v);}
constexpr std::uint64\u t运算符“”\u uint64(无符号长v)
{返回静态_cast(v);}
constexpr std::int_fast8_t运算符“”\u int_fast8(无符号长v)
{返回静态_cast(v);}
constexpr std::uint\u fast8\u t运算符“”\u uint\u fast8(无符号长v)
{返回静态_cast(v);}
constexpr std::int_fast16_t运算符“”\u int_fast16(无符号长v)
{返回静态_cast(v);}
constexpr std::uint\u fast16\u t运算符“”\u uint\u fast16(无符号长v)
{返回静态_cast(v);}
constexpr std::int_fast32_t运算符“”\u int_fast32(无符号长v)
{返回静态_cast(v);}
constexpr std::uint\u fast32\u t运算符“”\u uint\u fast32(无符号长v)
{返回静态_cast(v);}
constexpr std::int_fast64_t运算符“”\u int_fast64(无符号长v)
{返回静态_cast(v);}
constexpr std::uint\u fast64\u t运算符“”\u uint\u fast64(无符号长v)
{返回静态_cast(v);}
constexpr std::int_least8_t运算符“”\u int_least8(无符号长v)
{返回静态_cast(v);}
constexpr std::uint_least8_t运算符“”\u uint_least8(无符号长v)
{返回静态_cast(v);}
constexpr std::int_least16_t运算符“”\u int_least16(无符号长v)
{返回静态_cast(v);}
constexpr std::uint\u least16\u t运算符“”\u uint\u least16(无符号长v)
{返回静态_cast(v);}
constexpr std::int_least32_t运算符“”\u int_least32(无符号长v)
{返回静态_cast(v);}
constexpr std::uint_least32_t运算符“”\u uint_least32(无符号长v)
{返回静态_cast(v);}
constexpr std::int_least64_t运算符“”\u int_least64(无符号长v)
{返回静态_cast(v);}
constexpr std::uint_least64_t运算符“”\u uint_least64(无符号长v)
{返回静态_cast(v);}
constexpr std::intmax\u t运算符“”\u intmax(无符号长v)
{返回静态_cast(v);}
constexpr std::uintmax\u t运算符“”\u uintmax(无符号长v)
{返回静态_cast(v);}
constexpr std::intptr\u t运算符“”\u intptr(无符号长v)
{返回静态_cast(v);}
constexpr std::uintptr\u t运算符“”\u uintpttr(无符号长v)
{返回静态_cast(v);}
警告:如果在不适合
无符号long-long
的文字上使用,上述代码将自动给出错误的结果,如果文字值不适合请求的类型,例如
999_int8
,则会溢出。(GPL-3许可)可能必须逐个字符解析文本字符,并在溢出时执行
static\u assert
,如

使用用户定义的文字的缺点是需要在后缀前面加下划线
,因为根据§17.6.4.3.4,没有下划线的后缀是为将来的标准化保留的。

怎么样?