【问题标题】:What does a plus sign mean in front of a char array? [duplicate]char 数组前面的加号是什么意思? [复制]
【发布时间】:2023-04-03 11:17:01
【问题描述】:

我今天在阅读this answer,注意到字符数组前面有一个加号,但不知道它是什么意思。

考虑到我删除它时的编译错误,我可以猜测它有助于编译器推断返回类型,但我不知道它是如何工作的。

测试代码(也是here):

#include <iostream>

using namespace std;

auto& operator<<(std::ostream& os, const char (&s)[2]) {
    return os << (*s == ' ' && !s[1] ? +"\n" : +s);
}

int main() {
    cout << "Hello" << " " << "world" << " " << 2018;

    return 0;
}

当删除 加号 符号 (sample) 时,它不会编译:

main.cpp: 在函数'auto& operator

main.cpp:6:48: 错误:在扣除'auto'之前使用'auto& operator

return os << (*s == ' ' && !s[1] ? "\n" : s);
                                            ^

main.cpp:在函数'int main()'中:

main.cpp:10:24: 错误:在扣除'auto'之前使用'auto& operator

cout << "Hello" << " " << "world" << " " << 2018;
                    ^~~

【问题讨论】:

  • 好在我使用auto&amp; 作为返回类型,编译器错误比堆栈溢出更容易调试。

标签: c++ arrays string c++14


【解决方案1】:

内置一元operator+ 可以将指针类型(但不是数组类型)作为其操作数,因此在数组上使用它会导致array-to-pointer decay,然后+"\n"+s 将返回const char *

另一方面,如果您删除operator+ 的使用,您将尝试将const char[2] 类型的数组传递给os,这会导致递归调用,因为错误消息试图告诉您.

对于内置运算符,表达式必须具有算术、无范围枚举或指针类型。如果操作数具有整数或非作用域枚举类型,则对操作数执行整数提升,并确定结果的类型。

内置的一元加号运算符返回其操作数的值。它不是空操作的唯一情况是当操作数具有整数类型或无作用域枚举类型时,通过整数提升来更改,例如,它将char 转换为int,或者如果操作数受左值-右值、数组到指针或函数到指针的转换。

【讨论】:

    【解决方案2】:

    它是一元加。内置运算符只能应用于数值类型和指针。它所做的只是在需要时进行隐式转换,并原样返回操作数。

    由于s 是对数组的引用,因此在它衰减为指针之前不能应用+,因此运算符会强制进行数组到指针的转换。

    必须这样做的原因是"\n" 本身就是一个由两个字符组成的 const 数组。由于条件表达式具有其第二个和第三个操作数的公共类型,因此除非事先将一个操作数强制转换为指针,否则它将具有char const(&amp;)[2] 类型。

    你可以猜到operator&lt;&lt; 的哪个重载会被char const(&amp;)[2] 调用,难道不是吗?

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 2015-02-01
      • 1970-01-01
      相关资源
      最近更新 更多