Вызвать пользовательский литерал на lvalue

Есть ли способ вызвать пользовательский литерал на lvalues?

например, я хотел бы

int operator "" _xor1(int a) { return a^1; }

// Works fine
17_xor1;

auto myint = get_something_only_availabe_at_runtime();
// Any way to use _xor1 on myint?

_xor1(myint); // Doesn't work

Кроме того, при компиляции следующего кода в проводнике компилятора я с удивлением обнаружил, что все это было решено во время выполнения, хотя все данные доступны во время компиляции. Это почему?

constexpr int operator "" _xor1(unsigned long long a) {
    return a^1; 
}

int main() {
    // This code resolves the user defined literal at runtime on gcc, 
    // msvc and clang - I don't see why I can't use the 
    // user defined literal at runtime?
    return 17_xor1;
}

2 ответа

Решение

Я не уверен, что вы действительно хотите - как прокомментировано, вам, вероятно, лучше определить обычную функцию и вызвать ее - но я верю, что вы можете вызвать ее с помощью operator""_xor1(myInt),

Нет, вы не можете вызвать пользовательский литерал для переменной, заполненной во время выполнения. И вам не нужно. Просто определите автономную функцию, которую различные части кода могут вызывать при необходимости, например:

template <typename T>
T do_xor1(T a) { return a^1; }

int operator "" _xor1(unsigned long long a) { return do_xor1(a); }

// Works fine
17_xor1;

auto myint = get_something_only_availabe_at_runtime();
do_xor1(myint);
Другие вопросы по тегам