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

时间:2019-03-01 14:50:00

标签: c++ c++14 user-defined-literals

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

#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数据模型上是相同的。

默认情况下不可以吗?

1 个答案:

答案 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类型。

相关问题