以下是做什么的?我认为+仅用于整数提升。
char c[20] = "hello";
foo(+c);
foo(+"hello");
答案 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 *
的函数,那么这是不必要的:它已经隐式发生了。但是,当你有重载时(可能通过模板函数),这很重要。