来自右值的非常量引用的初始化无效

2023-12-04

所以我有以下功能:

void scan(std::istream& is, Handler& h);

我想以不同的方式调用它,例如:

scan(std::cin, Handler());
scan(std::ifstream("myfile"), myhandler);

编译器抱怨std::ifstream("myfile") and Handler()右值作为非常量引用传递,因此投诉是合法的,但我能做什么?

  1. 两个函数参数都不能是const (istream在读取时被修改,并且处理程序在回调期间更改其状态)。
  2. 如果我将参数类型更改为右值引用(&&)那么我将无法通过std::cin有时我真的很关心最终的状态myhandler因此我无法申请std::move对他们也没有。
  3. 原则上我可以通过模板或将参数作为通用参考auto&&类型推导,从而为左值和右值引用的所有可能组合重载此函数,但我无意为我已经指定的其他类型重载此函数。

还有其他选择吗?

不知何故,整个移动语义在这样一个微不足道的例子中出现了障碍。


要将右值转换为左值,可以使用此左值辅助函数:

template<class T>
T& lvalue_ref(T&& x) { return x; }

然后调用变成:

scan(lvalue_ref(std::ifstream("myfile")), lvalue_ref(Handler()));

这是安全的,因为临时者(ifstream and Handler) 在完整表达式结束之前不会被破坏。但是,请注意,这些是对临时变量的左值引用,因此在决定使用此方法时必须小心谨慎。我假设scan()返回后不保存对参数的引用/指针。

例如,不要像这样使用它:

int& x = lvalue_ref(5);
std::cout << x; // temporary is destructed, therefore Undefined Behavior

只要确保返回引用的生命周期与临时引用的生命周期相对应,就可以了。

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

来自右值的非常量引用的初始化无效 的相关文章

随机推荐

  • Oracle 中的 NLS_CHARACTERSET WE8ISO8859P1 和 UTF8 问题

    我目前在 oracle 中使用具有 NLS CHARACTERSET WE8ISO8859P1 的数据库 所以可以说我在 varchar2 字段中存储了一个值为 ma 重音字符 的值 因此在数据库中它存储为 ma 现在 当我尝试使用查询 s
  • 警告:函数“system”的隐式声明

    我的编译器出现错误 Warning implicit declaration of function system I added system cls 为了能够清除屏幕 现在我收到错误 我正在使用这段代码来测试 include
  • 在表单标签中打开默认输入

    I have the next application https codesandbox io s uwmig file index js There users can add as many fields as they want a
  • 如何根据帖子的日期和标题设置博客文章的永久链接?

    我有这个网站http www finalyearondesk com 我的博客帖子链接是这样设置的 http www finalyearondesk com index php id 28 我希望它像这样设置 Finalyearondesk
  • AWS RDS:使用 Navicat 连接

    我刚刚在弗吉尼亚北部创建了 RDS 实例并尝试使用 Navicat 连接该数据库 但我无法连接它 在网上搜索后我知道我们需要配置安全组 但就我而言 有一条通知 Your account does not support the EC2 Cl
  • “NewUserClient”应该如何实现

    我正在尝试与应用程序中的 ext 进行交互 我可以使用找到该服务IOServiceOpen我接到电话NewUserClient我的 dex 我可以看到type传递的参数正在日志中输出 在此之后我有点失落 在这里阅读有关新用户客户端我可以看到
  • WebBrowser (MSIE) - 使用 IOleCommandTarget 的 Exec 捕获 JS 错误

    我需要捕获 MS IE activex 控件 称为 WebBrowser 中的脚本错误 据我所知 这是由在我的应用程序中实现 IOleCommandTarget 接口并侦听 OLECMDID SHOWSCRIPTERROR 我执行了上述操作
  • Android中如何从DialogFragment获取数据到MainActivity?

    我使用创建一个应用程序DialogFragment 我想从中获取数据DialogFragment and setText in the MainActivity 在我的代码中我成功创建了AlertDialog 但我无法得到EditText价
  • Android 工具栏中心标题和自定义字体

    我试图找出为工具栏标题使用自定义字体的正确方法 并将其置于工具栏中央 客户要求 目前 我正在使用旧的 ActionBar 并且我将标题设置为空值 并使用setCustomView放置我的自定义字体 TextView 并使用 ActionBa
  • Tensorflow:模块必须应用于其实例化的图中

    我正在尝试使用 Django 提供通用句子编码器 代码一开始被初始化为后台进程 通过使用 Supervisor 等程序 然后使用 TCP 套接字与 Django 进行通信 并最终返回编码的句子 import socket from thre
  • 在 Windows 中安装 ImageMagick for paperclip gem

    我按照本指南使用回形针一切都好但是请注意 要启用调整大小 您需要在服务器上安装 ImageMagick 那么我应该如何安装ImageMagick 我有 WINDOWS 8 并在网站上http www imagemagick org 下载不了
  • 在 JMeter 中有条件地重新启动用户线程

    我知道我可以在 JMeter 中有条件地停止线程 在我的脚本中 我发送一个请求 然后提取它们的响应 json 以进一步处理它 在一些罕见的情况下 参数响应提供了一些我无法在进一步步骤中处理的值 我实际上可以通过提取另一个参数来检测这个有效响
  • 在 iOS 4 上使用 OCMock 验证测试设备异常退出,代码为 134

    我正在尝试将 OCMock 添加到我的 iOS 4 项目中 为了测试它 我有一堂课Person用一种方法 hello 当我运行这个测试时 void testMock id mock OCMockObject mockForClass Per
  • java无法删除文件?

    我正在尝试删除文件夹中的所有文件 import java io public class AddService public static void main String args File folder new File inputs
  • polymorphic_allocator:我何时以及为什么应该使用它?

    Here文档是关于参考参数 here是工作草案 我必须承认我不明白这样做的真正目的是什么polymorphic allocator以及我应该何时 为什么 如何使用它 举个例子 pmr vector有以下签名 namespace pmr te
  • 使用语义标记进行延迟图像加载

    我有一个图像非常丰富的网站 为了节省用户的带宽 我想在图像进入视口时延迟加载图像 有各种 jQuery 插件和类似的东西可以实现这一点 这是以放置实际图像网址而不是在src属性但在其他地方 这使得标记不太好 更糟糕的是 搜索引擎爬虫不太容易
  • 当状态栏旋转时隐藏时调整视图

    我四处浏览寻找这个问题的答案 但我只找到了有类似问题的人 而不是这个确切的问题 所以希望这里有人可以帮助我 我有一个 iPad 应用程序 在 iPad 上 当您纵向或横向握住 iPad 时 始终会显示带有时钟和电池的状态栏 出于这个原因 我
  • Visual Studio 2010 中未解析的外部符号

    我来自 Xcode 尝试在 Visual Studio 2010 中编译项目 但出现以下错误 2 gt ofxCLeye obj error LNK2019 unresolved external symbol struct GUID cd
  • 如何获得像slashdot的评论过滤菜单那样的固定位置菜单

    Slashdot 有一个小部件 可让您调整评论阈值以过滤掉经过修改的评论 如果您滚动到页面顶部 它将位于一个位置 当您向下滚动时 在某个时刻 其原始主页即将滚出页面 它将切换到固定位置 并保留在屏幕上 要查看示例 请单击here 我的问题是
  • 来自右值的非常量引用的初始化无效

    所以我有以下功能 void scan std istream is Handler h 我想以不同的方式调用它 例如 scan std cin Handler scan std ifstream myfile myhandler 编译器抱怨