v != std::exchange(v, previous(v)) 中的求值顺序

2024-01-12

我一直在寻找更多适合的习语std::exchange.

今天我发现自己写这个 https://stackoverflow.com/a/74600853/85371在一个答案中:

do {
    path.push_front(v);
} while (v != std::exchange(v, pmap[v]));

我比说更喜欢它

do {
    path.push_front(v);
    if (v == pmap[v])
        break;
    v= pmap[v];
} while (true);

希望有明显的原因。

然而,我对标准语不太感兴趣,我不禁担心lhs != rhs不保证右侧表达式不会在左侧表达式之前得到完全计算。这将使其成为同义反复的比较 - 根据定义将返回true.

然而,代码确实运行正确,显然是在评估lhs first.

有人知道吗

  • 标准是否保证该评估顺序
  • 如果最近的标准发生了变化,哪个标准版本首先指定了它?

附言。我意识到这是一个特殊情况f(a,b) where f is operator!=。我尝试使用此处找到的信息回答我自己的查询,但迄今为止未能得出结论:

  • https://en.cppreference.com/w/cpp/language/eval_order https://en.cppreference.com/w/cpp/language/eval_order
  • https://en.wikipedia.org/wiki/Sequence_point https://en.wikipedia.org/wiki/Sequence_point
  • C++ 函数参数中的求值顺序 https://stackoverflow.com/questions/2934904/order-of-evaluation-in-c-function-parameters
  • C++17 引入了哪些求值顺序保证? https://stackoverflow.com/questions/38501587/what-are-the-evaluation-order-guarantees-introduced-by-c17

C++17 引入了以下规则序列 https://en.cppreference.com/w/cpp/language/eval_order。以前的 UB 现在已经有了明确的定义。这适用于函数调用的参数以及精选的运算符:

之前排序的是一种不对称、传递、成对的关系 同一线程内的评估之间。

  • 如果 A 排序在 B 之前(或者,等效地,B 排序在 A 之后),则 A 的评估将在 B 的评估之前完成 开始。

内置的!=然而是not已测序(参见上面的链接)。函数调用将按顺序进行,但不保证计算的顺序:

  1. 在函数调用中,值计算和副作用 每个参数的初始化是不确定地测序与 关于任何其他参数的值计算和副作用。

(强调已添加)

根据我的阅读,即使您编写了包装函数,您的编译器也不需要评估v首先,然后std::exchange(v, pmap[v])最后equal(..)。我相信,颠倒求值顺序会改变示例中的语义。

如此可悲,就像std::exchange也就是说,在这种情况下,不能保证它会执行您需要的操作。

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

v != std::exchange(v, previous(v)) 中的求值顺序 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 迭代 C 数组

    我有一个在程序中某处创建的结构数组 后来 我想迭代它 但我没有数组的大小 如何迭代元素 或者我需要将尺寸存储在某处吗 如果在编译时已知数组的大小 则可以使用结构大小来确定元素的数量 struct foo fooarr 10 for i 0
  • 如何解决 Arango 查询承诺错误? [复制]

    这个问题已经存在了 我一直在尝试使用肥皂消息从 Arangodb 获取查询结果到我的前端服务 Angular 4 我能够获得查询结果 但在 console log 中打印出来 但是我如何在这个功能 Service 下获取它 这样我就可以输入
  • 如何在 React Native 中创建聊天气泡的卷曲箭头/尾部

    我目前正在用反应本机制作聊天气泡 由于我是反应原生的新手 我首先尝试在浏览器上制作聊天气泡 然后尝试在反应原生中复制相同的内容 我正在努力复制反应本机中的箭头 有什么想法 建议吗 普通 HTML CSS div p class to me
  • 使用 boost asio 进行多线程 http 处理是否需要线程?

    在Boost asio中股线文档 https www boost org doc libs 1 78 0 doc html boost asio overview core strands html它说 链可以是隐式的也可以是显式的 如以下
  • 如何确保你的计算图是可微的

    一些 Tensorflow 操作 例如tf argmax 是不可微分的 即在反向传播中不计算和使用梯度 一个答案Tensorflow 哪些操作是可微分的 哪些操作是不可微分的 https stackoverflow com question
  • Django 在模板中渲染动态图像

    在 Django 视图中 我可以生成动态图像 PNG 格式的图形 并创建一个响应 该响应是我的图形的图像 我可以让它在浏览器中显示 但没有网页 它只是图像 现在我想将此图像嵌入 HTML 模板中并渲染它 我怎样才能做到这一点 这是我的第一个
  • 在C++中如何通过向量的数据获取向量的索引?

    假设我有一个vector
  • Woocommerce 3 中的自定义模板

    我正在尝试仅为一个 ID 为 5555 的产品制作一个单独的模板 从其页面中删除照片并更改块结构 覆盖此文件会影响所有产品页面 wp content plugins woocommerce templates content single
  • 在 ASP.NET 中执行预定的后台工作

    我需要在我的 ASP NET 应用程序中定期执行某个任务 所以这样做 protected void Application Start Worker Start public static class Worker public stati
  • 如何在 Cheerio 中的单个
    标签后获取文本

    我正在尝试使用 Cheerio 获取一些放置在单个文本之后的文本 br tag 我已经尝试过以下几行 let price this nextUntil col search price discounted responsive secon
  • Java 中泛型类型的深度复制

    泛型类型的深拷贝 克隆 是如何实现的T E在 Java 中工作 是否可以 E oldItem E newItem olditem clone does not work 答案是不 因为无法找出哪个类将取代您的泛型类型E在编译时 除非你将其绑
  • 无法用我的服务器侦听端口 80

    对于此类问题非常新 我正在尝试在端口 80 上启动服务器 使用这个特定端口对我来说很重要 它失败了 但它可以在其他端口上工作 即使当我是 root 时 我可能有一些东西在端口 80 上运行 我想识别它以便更改其侦听端口 我看到这个命令可以帮
  • ADA 文件名与包名称

    我继承了一个 ADA 程序 其中源文件名和包文件名不遵循默认命名约定 ADA 对我来说是新的 所以我可能会错过一些简单的东西 但我在 GNAT Pro 用户指南中看不到它 这个类似的问题 https stackoverflow com qu
  • 在 asp.net 中使用 itextsharp 将 HTML 文本转换为 pdf 文件时出错

    我使用以下代码将编辑器 Ajax 控件 中的内容转换为 pdf using System using System Collections Generic using System Linq using System Web using S
  • 访问活动中片段内的文本视图

    我想在 ActionBar 中使用 Fragment 不幸的是 它看起来真的很复杂 我的片段有文本视图 我希望能够在我的活动之外与它们进行通信 在我开始使用 Fragments 之前 我可以通过以下方式访问它们 private EditTe
  • 如果字符常量是“int”类型,为什么它们被分配给“char”类型的变量?

    C11 标准规定字符常量 例如 x 属于类型int not char 这让我感到惊讶和困惑 尤其是作为一个相对初学者 我遇到了这个答案为什么 C 字符文字是 int 而不是 char https stackoverflow com ques
  • IPython选项卡仅完成部分模块

    我正在使用 EPD 版本的 python 和 IPython 使用 easy install 安装一些模块后 我注意到虽然可以导入它们 但无法使用 Tab 键完成它们 它们存在于路径上 但同时包含模块 pylab readline math
  • 在应用 SOLID 原则方面需要帮助 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Juile Lerman 关于 企业中的 EF 的pluralsight 课程给我留下了深刻的印象 并决定构建我的演示应用程序 我正在使用 VS
  • 为什么“ordinality(of: .day, in: .era, for: date)”对于不同时区的 2 个日期给出相同的结果?

    考虑以下代码 import UIKit let date Date guard let nycTimeZone TimeZone abbreviation EST let nzTimeZone TimeZone abbreviation N
  • v != std::exchange(v, previous(v)) 中的求值顺序

    我一直在寻找更多适合的习语std exchange 今天我发现自己写这个 https stackoverflow com a 74600853 85371在一个答案中 do path push front v while v std exc