来自cppreference的用户自定义const char*字面量示例

3

在cppreference上有这个例子(http://en.cppreference.com/w/cpp/language/user_literal):

void operator"" _print ( const char* str )
{
    std::cout << str;
}


int main(){
    0x123ABC_print;
}

输出: 0x123ABC

我不明白这是在做什么。一开始我以为 0x123ABC 只会被当作一个字符串,但是 0x123ABCHello_print 无法编译通过。然后我又认为 operator<< 被重载了,所以它总是用十六进制形式打印,但是 123_print 打印的是 123。而且大小写敏感: 0x123abC_print 打印的是 0x123abC

有人能解释一下吗?一方面,它仅接受整数作为参数,但另一方面,它将它们像字符串常量一样处理。

2个回答

3

http://en.cppreference.com/w/cpp/language/user_literal

void operator"" _print(const char* str)表示您的文字被视为const char*并打印出来,这就是为什么它区分大小写的原因。

0x123ABCHello_print不起作用,因为0x123ABCHello不是一个数字,在用户自定义字符串字面量中,您需要使用"0x123ABCHello"_print


1
你还需要一个 size_t 类型的第二个参数来实现该运算符的字符串版本。 - Fred Larson
这是否意味着我需要自己将其转换为包括大小写敏感的整数?看起来过于复杂和低效。 - Michael Mahn
@MichaelMahn:当然,这取决于你的需求,但一般来说,不需要:https://wandbox.org/permlink/gI9nI1ApJUsoCmLy - Andriy Tylychko

2
示例代码中,您可以看到:
12_w; // calls operator "" _w("12")

这意味着整数字面值被转换为一个“const char[]”。然后,您定义的用户字面量会接受它。由于它是一个“const char*”,所以“operator<<”只会打印直到遇到“\0”,没有像打印整数字面值时那样的特殊处理,比如“std::cout << 0xBADFOOD;”。

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