用户定义的文字与 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
类型。
我刚刚偶然发现了以下用户定义的文字:
#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
类型。