пользовательские литералы в сочетании с аргументом uint64_t - PullRequest
0 голосов
/ 01 марта 2019

Я просто наткнулся на следующий пользовательский литерал:

#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 Ответ

0 голосов
/ 01 марта 2019

Разве это не должно работать по умолчанию?

Нет.Этот стандарт требует, чтобы тип определяемого пользователем литерала был unsigned long long int [1] .long unsigned int - это не одно и то же, это отдельный тип.Даже если они имеют одинаковые свойства, std::is_same_v<unsigned long long int, long unsigned int> имеет значение false.

Вы должны использовать тип unsigned long long int, если хотите взять целое число для своего литерала.

...