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

时间:2014-09-06 14:43:12

标签: c++

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

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

2 个答案:

答案 0 :(得分:38)

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

  

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

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

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


一个简单的例子是:

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

答案 1 :(得分:23)

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

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