字符数组上的一元加运算符的目的是什么?

以下是做什么的? 我认为+只是整数提升。

char c[20] = "hello"; foo(+c); foo(+"hello"); 

它迫使数组衰减到一个指针,如第5.3.1节[expr.unary.op] / 7中间接声明的那样:

一元+运算符的操作数应具有算术,非范围枚举或指针types,结果是参数的值。 整型提升在整型或枚举操作数上执行。 结果的types是提升操作数的types。

您可能一开始不会看到它,但是由于数组不是列出的types之一,所以必须将其转换为指针以适合。 从那里,指针的值被返回。

在这两种情况下, foo(const char *)都将被选为foo(const char(&)[N]) 。 对于有用的东西的一些例子,你可以使用一元加,看到这个答案 。 包括转换一个枚举types为一个整数,并获得一个链接问题。 正如你所说,它也可以用于整体推广。 例如, unsigned char byte = getByte(); std::cout << +byte; unsigned char byte = getByte(); std::cout << +byte; 将打印数值而不是字符。


一个简单的例子是:

 char a[42]; cout << sizeof(a) << endl; // prints 42 cout << sizeof(+a) << endl; // prints 4 

一元+不仅是为数字types定义的,也是为指针types定义的。 但是,它没有被定义为数组。

所以, foo(+c)强制c被转换为指向其第一个元素的指针。 如果foo是一个被定义为接受char *的函数,那么这将不是必须的:它已经隐含地发生了。 但是,当你有重载(可能通过模板函数)时,它可能很重要。