以下是我能找到的关于此事的所有证据(引用N4140):
13.5
1具有以下内容之一的函数声明
运算符函数ID
正如其名称所声明的
操作员功能。
具有以下内容之一的函数模板声明
运算符函数ID
正如其名称所声明的
运算符函数模板。
运算符函数模板的专门化也是运算符函数。运算符函数称为
使生效
在其
运算符-函数-id。
运算符函数id:
operator
操作人员
操作员:
什么之中的一个
new delete new[] delete[]
+ - * / % Ë & | ~
! = < > += -= *= /= %=
Ë= &= |= << >> >>= <<= == !=
<= >= && || ++ -- , ->* ->
( ) [ ]
[
注:
最后两个运算符是函数调用(5.2.2)和下标(5.2.1)
new[]
,
delete[]
,
()
和
[]
由多个令牌形成。
尾注
]
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
是的typedef
std::basic_ostream<char>
,这是一个类。所以超载
operator<< (std::ostream&, T)
对任何类型都有效
T
.
这就是标准所要说的。超载没有特别的规定
<<
意思是流插入没有
不得不
这只是运算符重载的正常应用。如果你真的想要,你可以超载
%
而不是为此目的。
标准中唯一涉及
<<
我能想到的流是:
-
27.7.3.9/1
operator<<
输出流的右值引用的重载,其效果如下:
1.
影响:
os << x
所以如果你超载
<<
对于您的类,用于输出流rvalues的标准库插入器将为您的类调用它。
-
流迭代器(24.6)。例如,24.6.2/1表示:
1.
ostream_iterator
写入(使用
运算符<&书信电报;
)将连续元素添加到输出流中
建造。。。