istream类的运算符>>的“返回值”如何工作?

2023-12-04

我试图理解这句话:

    int main() {
        fstream inf( "ex.txt", ios::in );
        char c;
        while( inf >> c ) {
            cout << c << ", ";
        }
        return 0;
    }

什么是(inf >> c) 在上面的 while 循环中返回?我下载了 gcc 源代码并尝试使用它,但它对我来说太复杂了:(。

我检查了 C++ 参考页,我意识到它返回了对自身的引用:

    istream& operator>> (bool& val );
    istream& operator>> (short& val );
    istream& operator>> (unsigned short& val );
    istream& operator>> (int& val );
    istream& operator>> (unsigned int& val );
    istream& operator>> (long& val );
    istream& operator>> (unsigned long& val );
    istream& operator>> (float& val );
    istream& operator>> (double& val );
    istream& operator>> (long double& val );
    istream& operator>> (void*& val );

    istream& operator>> (streambuf* sb );

    istream& operator>> (istream& ( *pf )(istream&));
    istream& operator>> (ios& ( *pf )(ios&));
    istream& operator>> (ios_base& ( *pf )(ios_base&));

    *** the following functions are not members but GLOBAL functions:

    istream& operator>> (istream& is, char& ch );
    istream& operator>> (istream& is, signed char& ch );
    istream& operator>> (istream& is, unsigned char& ch );

    istream& operator>> (istream& is, char* str );
    istream& operator>> (istream& is, signed char* str );
    istream& operator>> (istream& is, unsigned char* str );

所以我创建了一个类似的类,比如说 my_istream:

struct my_istream {
    my_istream& self_ref;
};

int main() {
    my_istream mis;
}

编译时,我收到此错误:



1>c:\users\chan\documents\visual studio 2010\projects\topcoder\topcoder\main.cpp(26): error C2758: 'my_istream::self_ref' : must be initialized in constructor base/member initializer list
  

但是,我真的不知道在这种情况下 self_ref 应该初始化为什么?在处理链表时,我理解指向自身的指针,并且我理解该引用(&C++中的)只是C中指针的变相形式。但我无法解释这种情况?内部是如何实现的istream实际上工作吗?如何判断参考文献的真假?谢谢!

EDIT:

struct my_istream {
    my_istream() {
    }

    my_istream& operator >>( int x ) {
        return *this;
    }
};

int main() {
    my_istream mis;
    int x;
    while( mis.operator>>( x ) ) {
        cout << "--";
    }
}

我应该向 my_istream 类添加什么才能在 while 循环内工作?


要返回自我参考,您只需return *this。您实际上并未声明内部自引用。你can有引用成员,但必须在构造函数初始值设定项列表中初始化它们:class Foo { Foo(int& some_int_ref) :my_ref_member(some_int_ref)

istream 还有另一个重载来确定其布尔值。

可链接成员的示例(例如operator >>,但在本例中只是一个普通函数)并给一个类一个布尔值(尽管后者是一个值得拥有自己的主题的复杂主题):

#include <iostream>

class X {
    bool B;
public:
    X() :B(false) { }
    X& toggle() { B = !B; return *this; }
    operator void*() { return B ? this : 0; }
};

int main()
{
    X x;

    x.toggle().toggle().toggle();
    if (x)
        std::cout << "true!" << std::endl;
}

编辑:我不想深入研究operator bool vs operator void *在这个答案中,但是这个旧的 stackoverflow 问题应该给你很好的参考:为什么当我转换为“long”时会调用“operator bool()”?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

istream类的运算符>>的“返回值”如何工作? 的相关文章

  • 为什么这个 SIMD 数组添加示例与简单的实现相比没有表现出任何性能提升?

    class Program static void Main string args Console WriteLine Vector IsHardwareAccelerated SIMD supported SIMD not suppor
  • 使用和重载基类的模板成员函数?

    下面 构造Y超载X的成员函数f 两个重载都是模板函数 但采用不同的参数 typename and int 明确指定 struct X template
  • 从 WatchOS 捕获 Apple Watch 的型号标识符

    似乎没有任何记录的官方方法可以从手表应用程序获取 Apple Watch 模型 但有一篇文章显示了特殊用途sysctlbyname 如何确定Apple Watch型号 https stackoverflow com questions 49
  • 替换大字符串中的多个字符串的最快方法

    我正在寻找替换大 1mb 字符串的多个 500 子字符串的最快方法 无论我尝试过什么 String Replace 似乎都是最快的方法 我只关心最快的方式 不是代码的可读性 可维护性等 我不在乎是否需要使用不安全的代码或预处理原始字符串 每
  • 我想要 Linux 上的 C 函数来收集核心转储而不终止进程

    abort 确实收集核心转储 但我不希望进程终止 dump core 收集核心转储 但在内核空间中 用户空间中是否有与 dump core 等效的函数 自己做的一个简单方法是fork进程 创建父进程的完整副本 并调用abort来自子进程 子
  • 共享库 C++ Makefile

    我需要编译胖二进制文件才能在另一台 Linux 机器上使用它 但缺少一些库 因此据我了解 我应该使用一些 shared 选项来编译它 但我不明白如何为此配置 Makefile 目前我的 makefile 如下所示 CC g CC FLAGS
  • 在 C 中使用模板函数的最短示例?

    我如何处理函数echo tpl可以采取1类型参数int or string 然后打印出来 C没有模板 我认为你能做的最好的事情就是使用联合或让函数具有不同的名称 后一种具有不同名称的方法是准标准方法 例如fabs fabsf fabsl a
  • 即使指定了标头,g++ 也找不到标头

    所以基本上我有一些非常简单的代码 其中包括
  • Unix 编程。不确定如何使用 passwd 结构

    我做了一些研究 但仍在努力解决passwd结构 http www opengroup org onlinepubs 000095399 basedefs pwd h html http www opengroup org onlinepub
  • 在 UserControl C# .NET 中添加/停靠控件

    我正在编写一个 UserControl 它以编程方式添加子控件 目前我正在添加新的控件 如下所示 this Controls Add new Control Height 16 Dock DockStyle Top 我遇到的问题是新控件添加
  • 如何将值从 ASP.NET MVC 控制器传递到 MVC 视图内的 ASP.NET Webforms 控件?

    我的 ASP NET MVC 方法并未跨越 ASP NET Web 窗体 因此我很难理解如何更好地将值从 ASP NET MVC 控制器传递到 MVC 视图内的 ASP NET Webforms 脚本 例如 控制器动作 public Vie
  • CMake include_directories 和 add_subdirectories 之间的区别?

    我正在学习 CMake 来构建 C 代码 并努力解决以下概念 在我的根级目录中 我有一些 cpp 文件和 CMakeLists txt 它们在 gen cpp 目录中成功生成了一些 thrift 代码 我的根级别 CMakeLists tx
  • C++ 中的结构填充

    如果我有一个struct在 C 中 有没有办法安全地将其读 写到跨平台 编译器兼容的文件中 因为如果我理解正确的话 每个编译器都会根据目标平台进行不同的 填充 不 那是不可能的 这是因为C 在二进制层面缺乏标准化 Don Box http
  • NHibernate 继承 - 判别器值

    NHibernate 是否可以有一个像这样工作的判别器 如果值等于 String Empty gt Class1 其他 gt Class2 我已经有一个 CultureName 字符串列 我想将其用作鉴别器 我不想添加额外的布尔列 如果 C
  • 检测非 DPI 感知应用程序是否已扩展/虚拟化

    我正在尝试在 WinForms 应用程序中检测它是否由于操作系统具有高 DPI 而以缩放 虚拟化模式启动 目前 在以 3840x2400 缩放 200 缩放运行的系统中 应用程序将分辨率视为 1920x1200 DPI 为 96 缩放因子为
  • 如何在 JSON 输出上强制采用 ISO 格式“YYYY-MM-DDThh:mm:ss.sss”?

    我有一个 ASP NET WebApi2 api 它返回一些 JSON 格式的时间戳 时间戳具有毫秒分辨率 通常我会得到这种格式的时间戳 这很好 YYYY MM DDThh mm ss sss 不幸的是 如果时间戳恰好用整秒对日期进行编码
  • 当调试器退出且没有调用堆栈时,用于跟踪 C# 崩溃的工具?

    我有一个大型 复杂的 C GUI 应用程序 它以完全可重现的方式崩溃 但我无法轻松诊断崩溃的原因 因为调试会话不是以通常的方式使用调用堆栈破坏调试器 而是完全退出 唯一的提示是输出窗口末尾有一条消息 STATUS STACK BUFFER
  • 如何隐藏鼠标光标?

    我想问是否有人可以为我提供一个 C 代码 在其中我可以在按下特定键时隐藏 显示鼠标指针 我发现一些只为 TURBO C 编写的代码 它们都不能使用 dev c 甚至 Visual c 编译和运行 我尝试运行在 Dev C 中找到的代码 但我
  • 着色器可以旋转形状以面向相机吗?

    我制作了一个球出现在 3D 空间中的场景 三角球耗费大量资源 所以我使用带有球纹理的二维表面 四边形 来完成此操作 但现在我需要在每次相机移动时调整形状的方向 我使用位置变换和 LookAt 方法来完成此操作 问题是我可以优化这个吗 如果可
  • 将用户控件绑定到 bool 属性的相反值

    非常简单 我想做同样的事情this https stackoverflow com questions 534575 how do i invert booleantovisibilityconverter但在winforms中 谷歌似乎提

随机推荐

  • 文件无效:错误:转储失败,因为找不到 AndroidManifest.xml

    当我尝试在 Android 市场上传我的 Android 应用程序时 我遇到了这个问题 我去过stackoverflow 的这个问答我相信导出时我的 AndroidManifest xml 位于 apk 文件中 并且该 xml 文件的所有内
  • AJAX上传显示多个文件上传中仅文件的进度

    请帮我更改下面的代码 我有多个从 HTML 上传的文件 ajax 将所有上传的文件发布到一个 php 脚本 该脚本向进度函数发送反馈 问题是所有三个进度条只监听一个文件上传
  • 如何在 JSF 中收集 List 的提交值?

    我有一颗豆子List
  • 是否可以实现 __super 宏?

    请告诉我是否有办法手动实现微软特定的 super宏观 class Base public void func something class Derived public Base public void func Base func ju
  • 带有 Java 线性和对数滤波器的 MFCC

    我正在用Java实现MFCC算法 Java 中有三角滤波器和 MFCC 的示例代码 链接在这里 MFCC Java但是我应该遵循用 Matlab 编写的代码 MFCC MATLAB 我的问题是在 Matlab 代码中 它讨论了线性和对数滤波
  • Java 8 流是原子的吗?

    我读了一些帖子 但我仍然很困惑 我知道并行流将以利用 CPU 的并行方式执行 我相信子作业将作为原子单元执行 对吗 但是常规的 Java 8 流呢 如果我执行下一行代码 users stream map user gt user getUs
  • 在表单提交的网址中间添加问号

    当我单击表单中的提交按钮时 它会添加一个 就在 之前 因此 app pageName 更改为 app pageName 这是正常行为吗 代码只是基本的东西 angular module myApp controller MyCtrl fun
  • 如何在进入 Java 应用程序时更改光标

    我遇到了一些我无法解决的问题 我正在编写一个带有接受拖放操作的 JList 的 Swing Java 应用程序 我想在将文件或文件夹从系统拖到 Java 应用程序上时更改光标 我自己找到了 不过还是感谢克林顿的回答 这是我用过的 首先创建
  • Socket tcp C# 如何清除输入缓冲区?

    我正在为 Windows Phone 编写一个应用程序 我需要与服务器通信并传输数据 SERVER是用C 编写的 我无法修改它 客户是我必须写的 服务器被设计为客户端连接到它并传输数据 连接对于所有传输都保持打开状态 通过用 C 编写代码
  • Infinispan相当于ehcache的copyOnRead和copyOnWrite

    我计划在现有的网络应用程序中实施缓存解决方案 没什么复杂的 基本上是一个支持溢出到磁盘和自动驱逐的并发映射 将来可能需要对缓存进行集群 但不是现在 我喜欢 ehcache 的 copyOnRead 和 copyOnWrite 功能 因为这意
  • 将 Crypto++ 对象保存到 std::vector

    我想将 Crypto 密钥保存到std vector
  • 如何使scrollviewer滚动像素而不是组件(wpf)

    我试图让我的滚动查看器完美地滚动 也就是说 我有一个滚动查看器 它包含一个 stackpanel 堆栈面板包含一个用户制作的用户控件 并且它们可以在运行时动态增加或减少 问题是 假设我的堆栈面板中只有 2 个用户控件 滚动查看器只有 2 级
  • 拖动对象时启用其他事件

    我正在开发一个控制台 我想将按钮拖动到网格中 要拖动按钮 我使用以下过程 Public drag As Boolean False Public ptX As Integer 0 Public ptY As Integer 0 Public
  • MongoDB:基于另一个集合从一个集合中进行条件选择

    我对 MongoDB 相当陌生 需要帮助根据另一个集合的数据对一个集合进行选择或某种左连接 我有两个集合 动物和膳食 我想获取在某个日期 假设是 20171001 之后上次注册膳食的动物 以确定该动物是否仍然活跃 collection an
  • 在 SQL Server 上的特定位置添加列?

    我想知道是否有办法在创建 SQL Server 表后将列添加到特定位置 Thanks 您可以在 Management Studio 中执行此操作 您可以通过在保存更改之前生成 SQL 脚本来检查完成此操作的方式 基本上是通过以下方式实现的
  • React JS - 如何在状态更新之前阻止渲染 [Hooks]

    我有一个从 API 获取数据以向用户显示一些详细信息的组件 const ItemDetail match gt const item setItem useState null useEffect gt const abort new Ab
  • 请求获取日历事件响应 404,前提是分配了权限并使用 Microsoft Graph API 获取了 accessToken

    我想构建一个具有获取其他人的日历事件功能的网络应用程序 我已经注册了该应用程序https apps dev microsoft com 并要求Calendars Read允许 我确信管理员已同意分配这些权限 我让他通过管理员同意页面来完成
  • Kotlin 中的静态方法和变量?

    我希望能够将类实例保存到私有 公共静态变量中 但我不知道如何在 Kotlin 中执行此操作 public class Foo private static Foo instance public Foo if instance null i
  • 在 C++ 中嵌入 python/numpy

    我正在尝试在我的 C 应用程序中使用 python 3 带有 numpy 这需要将 C 数组发送到 python 执行计算 然后在 C 中检索结果 为此 我基于此处讨论的代码 https codereview stackexchange c
  • istream类的运算符>>的“返回值”如何工作?

    我试图理解这句话 int main fstream inf ex txt ios in char c while inf gt gt c cout lt lt c lt lt return 0 什么是 inf gt gt c 在上面的 wh