用户定义字面量可以作为函数参数吗?

4

函数可以和用户自定义字面量一起使用吗?

如果可以,那么可以做些什么有趣的事情呢?这是否合法?

void operator "" _bar(int (*func)(int)) {
  func(1);
}

int foo(int x) {
  std::cout << x << std::endl;
}

int main() {
  foo(0);    // print 0
  foo_bar;   // print 1
}

我认为""用户自定义字面量的参数始终是char*size_t,不是吗? - Mooing Duck
4个回答

7
根据 C++11 Feb 2011 草案 §2.14.8,用户字面类型是整数字面、浮点字面、字符串字面和字符字面。无法使用函数字面类型。
用户定义字面会被视为对字面运算符或字面运算符模板(13.5.8)的调用。为了确定给定带有 ud 后缀 X 的用户定义字面 L 的调用形式,将查找其字面后缀标识符为 X 的字面运算符 id,在 L 的上下文中使用未限定名称查找规则(3.4.1)。设 S 为此查找所得到的声明集合。S 不得为空。
整数:
operator "" X (n ULL)
operator "" X ("n")
operator "" X <’c1’, ’c2’, ... ’ck’>()

浮点数:

operator "" X (f L)
operator "" X ("f")
operator "" X <’c1’, ’c2’, ... ’ck’>()

字符串:

operator "" X (str, len)
operator "" X <’c1’, ’c2’, ... ’ck’>() //unoffcial, a rumored GCC extension

角色:

operator "" X (ch)

2
对的,函数名是标识符,而不是字面量。因此,用户定义的字面量不适用于它们。 - Michael Price
@MichaelPrice 这是一个很好的表述方式。 - Pubby
我觉得对于想要“函数字面量”的任何合法用途,都应该通过lambda表达式来处理,是吗? - Tim Seguine

1

不行。

C++故意避免这种花招,因为如果在示例中没有立即定义foo_bar符号,它将非常难以理解。

您可以通过预处理器实现类似的功能。

#define bar (1)

int foo(int x) {
  std::cout << x << std::endl;
}

int main() {
  foo(0);    // print 0
  foo bar;   // print 1
}

1
看看 foo_bar,它只是一个单一的词汇标记。它被解释为一个名为 foo_bar 的单个标识符,而不是 foo 后缀加上 _bar

1

我不知道这是否有所帮助,但没有任何阻止你定义

PythonScript operator"" _python(const char*, std::size_t len) {...}

R"Py(
  print "Hello, World"
)Py"_python;

我认为用户定义的字面量会成为嵌入脚本或SQL的好方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接