可以将功能与用户定义的文字一起使用吗?
如果是这样,可以做些什么恶作剧?这合法吗?
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
}
答案 0 :(得分:7)
根据C ++ 2011年2月11日草案§2.14.8,用户文字类型是整数文字,浮动文字,字符串文字和字符文字。没有办法做函数 - 文字类型。
用户定义的文字被视为对文字运算符的调用 文字运算符模板(13.5.8)。确定此调用的形式 对于给定的用户定义的文字L和ud-suffix X, 查找其文字后缀标识符为X的literal-operator-id 在L的上下文中使用规则进行非限定名称查找 (3.4.1)。设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)
答案 1 :(得分:1)
查看foo_bar
,它只是一个词汇标记。它被解释为名为foo_bar
的单个标识符,而不是foo
后缀为_bar
。
答案 2 :(得分: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
}
答案 3 :(得分:1)
我不知道这是否会增加任何内容,但没有什么可以阻止你定义
PythonScript operator"" _python(const char*, std::size_t len) {...}
R"Py(
print "Hello, World"
)Py"_python;
我实际上认为用户定义的文字可以很好地嵌入脚本或SQL。