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

user-defined literals combined with an uint64_t argument

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

#include <cstdint>

constexpr auto operator""_G(uint64_t v) { return v * 1'000'000'000ULL; }

但是,这不能用 GNU 7.3.0 和 -std=c++14 编译。我收到 "has invalid argument list" 错误。

根据 https://en.cppreference.com/w/cpp/language/user_literal,唯一允许的无符号 64 位类型是 unsigned long long int。但是,stdint.h 中的 uint64_t typedef 映射到 GCC 内置定义 __UINT64_TYPE__.

#define __UINT64_TYPE__ long unsigned int;

这个定义是通过运行gcc -dM -E an_empty_file.c | grep "__UINT64_TYPE__"

得到的

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

这不应该默认工作吗?

Shouldn't this work by default?

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

如果您想为文字取整数,则必须使用 unsigned long long int 类型。