用户定义的文字与UINT64_T参数相结合

user-defined literals combined with an uint64_t argument

本文关键字:参数 相结合 UINT64 定义 文字 用户      更新时间:2023-10-16

我只是偶然发现了以下用户定义的文字:

#include <cstdint>
constexpr auto operator""_G(uint64_t v) { return v * 1'000'000'000ULL; }

但是,这不会使用GNU 7.3.0和-std=c++14编译。我得到一个"有无效的参数列表"错误。

根据https://en.cppreference.com/w/cpp/language/user_literal,唯一允许的未签名的64位类型是unsigned long long int。但是,来自stdint.huint64_t Typedef映射到GCC内置定义__UINT64_TYPE__

#define __UINT64_TYPE__ long unsigned int;

通过运行gcc -dM -E an_empty_file.c | grep "__UINT64_TYPE__"

获得此定义

当然,用unsigned long long int替换uint64_t会避免编译错误。但是这两种类型在LP64数据模型上是相同的。

默认情况下不应该工作吗?

默认情况下不应该工作吗?

nope。该标准要求用户定义的字面类型为 unsigned long long int [1] long unsigned int不是同一回事,它是其自己独特的类型。即使它们具有完全相同的属性,std::is_same_v<unsigned long long int, long unsigned int>是错误的。

如果要使用字面的整数编号,则必须使用unsigned long long int的类型。