2014-09-06 68 views
34

以下内容做了什么?我认为+仅适用于整数升级。char数组上的一元加运算符的用途是什么?

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

这个最简单的情况是*正数lambdas *,它们完全一样将衰减到函数指针的lambda:'+ [](){}' – Manu343726 2014-09-07 07:00:57

+1

@ Manu343726在您的表达式中,生成的函数指针是有效的?或者匿名lambda函数已经超出了范围?用代码表示,是'(* + [](){})()'valid? – Ponkadoodle 2014-12-21 07:58:41

回答

32

它迫使阵列衰减到一个指针,如在间接指出§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 
+0

'会打印数字值而不是字符'...除非sizeof(char)== sizeof(int)',对吧? – fredoverflow 2014-09-06 15:18:47

+9

@FredOverflow'char'和'unsigned char'总是被提升为'int'或'unsigned int',即使它们已经具有相同的大小。 – hvd 2014-09-06 15:21:56

+0

这是C++中常见的习惯用法,还是有更好的方法来编写它(例如,演员表),使其更加明显地发生了什么? – 2014-09-07 04:24:06

22

一元+数字类型不仅限定,同时也为指针类型。但是,它没有被定义为数组。

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