代码之家  ›  专栏  ›  技术社区  ›  Ayrosa

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

  •  1
  • Ayrosa  · 技术社区  · 10 年前

    我在N4140中寻找类似的东西,但找不到:

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

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

    1 回复  |  直到 10 年前
        1
  •  3
  •   Angew is no longer proud of SO    10 年前

    以下是我能找到的关于此事的所有证据(引用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 写入(使用 运算符<&书信电报; )将连续元素添加到输出流中 建造。。。