Пользовательские литералы в сочетании с аргументом 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 если вы хотите взять целое число для вашего литерала.

Другие вопросы по тегам