Пользовательские литералы в сочетании с аргументом uint64_t
Я просто наткнулся на следующий пользовательский литерал:
#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
typedef от stdint.h
сопоставлен со встроенным определением 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.
Разве это не должно работать по умолчанию?
1 ответ
Разве это не должно работать по умолчанию?
Нету. Этот стандарт требует, чтобы тип определяемого пользователем литерала был unsigned long long int
[1]. long unsigned int
это не то же самое, это свой собственный особый тип. Даже если они имеют одинаковые свойства, std::is_same_v<unsigned long long int, long unsigned int>
ложно
Вы должны использовать тип, который unsigned long long int
если вы хотите взять целое число для вашего литерала.