我看了N4140这样的事情,却找不到它:
std::ostream& operator<<(std::ostream& os, const T& obj)
{
// write obj to stream
return os;
}
这不应该在标准中记录吗?
答案 0 :(得分:3)
以下是我在此事上可以找到的所有证据(引用N4140):
<强> 13.5 强>
1具有以下 operator-function-ids 之一作为其名称的函数声明声明了运算符函数。具有以下之一的函数模板声明> operator-function-ids ,因为它的名称声明了一个运算符函数模板。运算符函数模板的特化也是一个运算符函数。运算符函数被称为实现在其 operator-function-id中命名的运算符。
操作员功能-ID:
operator
运营商运营商:
之一new delete new[] delete[] + - * / % ˆ & | ~ ! = < > += -= *= /= %= ˆ= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> ( ) [ ]
[注意:最后两个运算符是函数调用(5.2.2)和下标(5.2.1)。运算符
new[]
,delete[]
,()
和[]
由多个令牌组成。 -end note ]6运算符函数应该是非静态成员函数或者是非成员函数 至少一个参数,其类型是类,对类的引用,枚举或对引用的引用 列举。 ...
<强> 13.5.2 强>
1二元运算符应由具有一个参数的非静态成员函数(9.3)实现 或者由具有两个参数的非成员函数。因此,对于任何二元运算符
@
,可以解释x@y
作为x.operator@(y)
或operator@(x,y)
。如果已声明两种形式的运算符函数, 13.3.1.2中的规则确定使用哪种解释(如果有的话)。
标准禁止将std
中的类指定为操作符函数的参数类型(或任何函数)。
请注意13.5 / 1中表格中<<
和>>
的存在。这意味着对于任何两种类型的operator <<
重载是合法的,其中至少一种类型符合13.5 / 6中列出的条件。 std::ostream
是std::basic_ostream<char>
的typedef,它是一个类。因此,重载operator<< (std::ostream&, T)
对任何类型T
都有效。
这就是它的所有标准。重载<<
以表示流插入没有特殊规则 - 不必。这只是运算符重载的正常应用。如果您真的想要,可以为此目的重载%
。
标准中唯一可以触及我<<
的{{1}}的地方是:
27.7.3.9/1,对于输出流的右值引用的operator<<
重载,将其效果列为:
1 效果:
os << x
因此,如果为类重载<<
,输出流rvalues的标准库插入器将为您的类调用它。
流迭代器(24.6)。例如,24.6.2 / 1表示:
1
ostream_iterator
将(使用operator<<
)个连续元素写入输出流中 建成了。 ...