C ++中的固定宽度整数文字?

时间:2016-04-04 15:07:26

标签: c++ c++11 language-lawyer c++14 user-defined-literals

C ++ 11首先引入了对通过用户定义的文字将新文字定义为C ++的支持。 C ++ 11或更高版本是否也为<cstdint>中的类型预定义了固定宽度整数文字的后缀?

1 个答案:

答案 0 :(得分:9)

否。从C ++ 14开始,标准定义的唯一字面后缀由标准中的<chrono><complex><string>标题提供图书馆。 <chrono>标头定义了hminsmsusns后缀的持续时间,{ {1}}为虚数定义<complex>iil后缀,if<string>文字定义s后缀。

但是,可以轻松定义自己的固定宽度文字,如下所示:

basic_string

警告:如果在不符合#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); } 的文字上使用,上面的代码会默默地给出错误的结果,如果文字值不适合,则会溢出进入所请求的类型,例如unsigned long longbetter implementation(获得许可的GPL-3)可能需要逐字逐句地解析字面值,并在溢出时999_int8解析,如this

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