在左值上调用用户定义的文字

时间:2018-08-16 04:35:47

标签: c++ c++11 user-defined-literals

有什么方法可以在左值上调用用户定义的文字吗?

例如,我想

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 个答案:

答案 0 :(得分:1)

我不确定您是否真的想要-正如评论所言,您最好定义一个普通函数并调用它-但我相信您可以使用operator""_xor1(myInt)来调用它。

答案 1 :(得分:1)

否,您不能在运行时填充的变量上调用用户定义的文字。您也不需要。只需定义一个独立的函数,不同的代码段可以在需要时调用,例如:

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);