我只是偶然发现了以下用户定义的文字:
#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
。但是,来自uint64_t
的{{1}} typedef被映射到GCC内置定义stdint.h
。
__UINT64_TYPE__
通过运行#define __UINT64_TYPE__ long unsigned int;
当然,用gcc -dM -E an_empty_file.c | grep "__UINT64_TYPE__"
替换uint64_t
可以避免编译错误。但是这两种类型在LP64数据模型上是相同的。
默认情况下不可以吗?
答案 0 :(得分:3)
默认情况下不可以吗?
不。该标准要求用户定义文字的类型为unsigned long long int
[1] 。 long unsigned int
是不同的东西,它是自己的不同类型。即使它们具有完全相同的属性,std::is_same_v<unsigned long long int, long unsigned int>
也是错误的。
如果要为文字取整数,则必须使用unsigned long long int
类型。