在char数组前加号是什么意思?

cbu*_*art 5 c++ arrays string c++14

我今天正在阅读这个答案并注意到char数组前面有一个加号,但不知道它是什么意思.

鉴于我删除它时的编译错误我可以猜测它是帮助编译器推断返回类型的东西,但我不知道它是如何工作的.

测试代码(也在这里):

#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;
}
Run Code Online (Sandbox Code Playgroud)

删除加号(示例)时,它不会编译:

main.cpp:在函数'auto&operator <<(std :: ostream&,const char(&)[2])'中:

main.cpp:6:48:错误:在扣除'auto'之前使用'auto&operator <<(std :: ostream&,const char(&)[2])'

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

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

main.cpp:10:24:错误:在扣除'auto'之前使用'auto&operator <<(std :: ostream&,const char(&)[2])'

cout << "Hello" << " " << "world" << " " << 2018;
                    ^~~
Run Code Online (Sandbox Code Playgroud)

son*_*yao 4

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

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

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

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