在C ++标准中,它记录了用户定义类型的I / O吗?

时间:2015-02-06 13:03:17

标签: c++ c++11 language-lawyer c++14

我看了N4140这样的事情,却找不到它:

std::ostream& operator<<(std::ostream& os, const T& obj)
{
  // write obj to stream
  return os;
}

这不应该在标准中记录吗?

1 个答案:

答案 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::ostreamstd::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<<)个连续元素写入输出流中   建成了。 ...