我今天在读this answer时,发现char数组前面有一个 plus 符号,但不知道这是什么意思。
鉴于我删除它时的编译错误,我猜它可以帮助编译器推断返回类型,但是我不知道它是如何工作的。
测试代码(也为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 <<(std :: ostream&,const char(&)[2])':
main.cpp:6:48:错误:在扣除“自动”之前使用“自动&运算符<<(std :: ostream&,const char(&)[2])”
return os << (*s == ' ' && !s[1] ? "\n" : s); ^
main.cpp:在函数'int main()'中:
main.cpp:10:24:错误:在扣除“自动”之前使用“自动&运算符<<(std :: ostream&,const char(&)[2])”
cout << "Hello" << " " << "world" << " " << 2018; ^~~
答案 0 :(得分:4)
内置一元operator+
可以将指针类型(而不是数组类型)作为其操作数,因此在数组上使用它会导致array-to-pointer decay,然后是+"\n"
和{{1} }将返回+s
。
另一方面,如果删除了const char *
的使用,您将尝试将类型为operator+
的数组传递给const char[2]
,这将导致递归调用,因为错误消息试图告诉您。
对于内置运算符,表达式必须具有算术,无作用域枚举或指针类型。如果操作数具有整数或无范围的枚举类型并确定结果的类型,则对操作数执行积分提升。
内置的一元加运算符返回其操作数的值。它不是空操作的唯一情况是操作数具有整数类型或无作用域枚举类型(通过整数提升更改),例如,将
os
转换为char
或如果操作数为进行左值到右值,数组到指针或函数到指针的转换。
答案 1 :(得分:4)
一元加号。内置运算符只能应用于数字类型和指针。如果需要的话,它会引起隐式转换,并返回操作数不变。
由于s
是对数组的引用,因此不能在衰减到指针之前应用+
,因此运算符会强制进行数组到指针的转换。
必须这样做的原因是"\n"
本身是两个字符的const数组。由于条件表达式具有第二和第三操作数的通用类型,因此除非事先将一个操作数强制转换为指针,否则条件表达式的类型为char const(&)[2]
。
您可以猜测operator<<
将调用哪个char const(&)[2]
过载吗?