оператор перегрузки enum | constexpr и время выполнения - PullRequest
0 голосов
/ 28 марта 2020

У меня есть предварительно объявленное перечисление:

enum class TheEnum : std::uint32_t;

С последующей перегрузкой оператора:

constexpr TheEnum operator|(TheEnum const a, TheEnum const b)
{
    return TheEnum(std::uint32_t(a) | std::uint32_t(b));
}

С определением:

enum class TheEnum : std::uint32_t
{
    A = 1 << 0,
    B = 1 << 1,
    C = 1 << 2,
    D = 1 << 3,
    Val0 = TheEnum::A | TheEnum::C,
    Val1 = TheEnum::A | TheEnum::D,
    Val2 = TheEnum::B | TheEnum::D
};

Я пытаюсь получить оператор | constexpr и не constexpr одновременно. В настоящее время, если я добавлю (не constexpr):

inline TheEnum operator|(TheEnum const a, TheEnum const b)
{
    return TheEnum(std::uint32_t(a) | std::uint32_t(b));
}

Мой компилятор сказал, что он уже определен. Constexpr позволяет мне выполнять некоторые типовые операции, но мне нужны те же операторы для оценки времени выполнения.

1 Ответ

2 голосов
/ 28 марта 2020

constexpr для функции означает, что функция может быть оценена во время компиляции. Это не означает, что имеет для оценки во время компиляции.

Вы хотите объявить вашу функцию constexpr, и этого достаточно для использования как во время компиляции, так и во время выполнения. .

Вы не можете объявить две функции, которые отличаются только на constexpr и / или inline. Эти спецификаторы не являются частью сигнатуры функции и поэтому не определяют отдельные перегрузки функции. Независимо от того, используете ли вы их, вы ссылаетесь на одну и ту же сущность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...