char数组上一元加运算符的用途是什么?

use*_*723 38 c++

以下是做什么的?我认为+仅用于整数提升.

char c[20] = "hello";
foo(+c);
foo(+"hello");
Run Code Online (Sandbox Code Playgroud)

chr*_*ris 38

它强制数组衰减为指针,如§5.3.1[expr.unary.op]/7中间接所述:

一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值.对整数或枚举操作数执行整体提升.结果的类型是提升的操作数的类型.

您可能一开始看不到它,但由于数组不是列出的类型之一,因此必须将其转换为指针才能适合.从那里,返回指针的值.

在这两种情况下,foo(const char *)都会选择a foo(const char(&)[N]).对于一些有用的东西,您可以使用一元加,请参阅此答案.包括将枚举类型转换为整数并绕过链接问题.如你所说,它也可以用于整体推广.例如,unsigned char byte = getByte(); std::cout << +byte;将打印数值而不打印字符.


一个简单的例子是:

char a[42];
cout << sizeof(a) << endl;  // prints 42
cout << sizeof(+a) << endl; // prints 4
Run Code Online (Sandbox Code Playgroud)

  • @FredOverflow`char`和`unsigned char`总是被提升为`int`或`unsigned int`,即使它们已经具有相同的大小. (9认同)

小智 23

一元+不仅定义为数字类型,还定义指针类型.但是,它没有为数组定义.

因此,foo(+c)强制c转换为指向其第一个元素的指针.如果foo一个函数被定义为采用a char *,则没有必要:它已经隐式发生了.但是,当你有重载时(可能通过模板函数),这很重要.