【问题标题】:What is the purpose of unary plus operator on char array?char数组上的一元加运算符的目的是什么?
【发布时间】:2014-09-06 14:43:12
【问题描述】:

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

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

【问题讨论】:

  • 最奇怪的情况是 正 lambdas,它的作用完全相同,可以将 lambda 衰减为函数指针:+[](){}
  • @Manu343726 在您的表达式中,生成的函数指针是否有效?还是匿名 lambda 函数已经超出范围?用代码表述,(* +[](){} )() 有效吗?

标签: c++


【解决方案1】:

它强制数组衰减为指针,如 §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

【讨论】:

  • will print the numerical value and never the character... 除非sizeof(char) == sizeof(int),对吧?
  • @FredOverflow charunsigned char 总是被提升为 intunsigned int,即使它们的大小已经相同。
  • 这是 C++ 中的常见习语,还是有更好的编写方法(例如演员表),可以更清楚地了解发生了什么?
  • @NateEldredge,我从来没有见过它用于数组,但是对于代码中很多地方需要从枚举或更小的整数中获取整数的地方,强制转换真的加起来了他们占用的空间,所以它在那里做得很好。我会说,当有一两个奇怪的实例可以使用它时,它确实是最值得商榷的。
  • VS2017 在两种情况下都打印“42”
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2011-07-23
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2011-10-25
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多