智能编译器是否可以在不成为语言一部分的情况下完成 std​​::move 所做的所有事情?

2023-12-12

这是一个有点理论上的问题,但是尽管我对 std::move 有一些基本的了解,但我仍然不确定它是否为该语言提供了一些理论上无法通过超级智能编译器实现的附加功能。我知道这样的代码:

{
  std::string s1="STL";
  std::string s2(std::move(s1));
  std::cout << s1 <<std::endl;
} 

是一种新的语义行为而不仅仅是性能糖。 :D 但说实话,我猜在执行 std::move(x) 后没有人会使用 var x。 另外,对于仅可移动的数据(std::unique_ptr、std::thread),如果类型声明为可移动,编译器无法自动执行移动构造和旧变量的清除吗? 同样,这意味着将在程序员后面生成更多代码(例如,现在您可以计算 cpyctor 和 movector 调用,而使用 automagic std::moving 则无法做到这一点)。


No.

但说实话,我猜在执行 std::move(x) 后没有人会使用 var x

绝对不能保证。事实上,很大一部分原因是std::move(x) is not编译器自动使用是因为,它无法自动决定您是否打算这样做。这是明确定义的行为。

此外,删除右值引用意味着编译器可以自动为您编写所有移动构造函数。这绝对不是真的。 D 有类似的方案,但它完全失败了,因为在许多有用的情况下,编译器生成的“移动构造函数”无法正常工作,但您无法更改它。

它还会阻止完美转发,而完美转发还有其他用途。

委员会犯了许多愚蠢的错误,但右值引用不是其中之一。

Edit:

考虑这样的事情:

int main() {
    std::unique_ptr<int> x = make_unique<int>();
    some_func_that_takes_ownership(x);
    int input = 0;
    std::cin >> input;
    if (input == 0)
        some_other_func(x);
}

哎哟。怎么办?您无法在编译时改变“输入”的值。如果身体some_other_func and some_func_that_takes_ownership未知。这是停止问题——你无法证明这一点x之后使用或未使用some_func_that_takes_ownership.

D 失败。我答应举个例子。基本上,在 D 中,“移动”是“二进制复制并且不破坏旧的”。不幸的是,考虑一个带有指向自身的指针的类——您可以在大多数字符串类、大多数基于节点的容器、设计中找到它。std::function, boost::variant,以及许多其他类似的方便的值类型。指向内部缓冲区的指针将被复制,但是哦,不!指向旧缓冲区,而不是新缓冲区。旧缓冲区被释放 - GG 你的程序。

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

智能编译器是否可以在不成为语言一部分的情况下完成 std​​::move 所做的所有事情? 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 重塑存储在集合中的数组并导出为 CSV

    我有一个 Facebook 页面点赞的集合 标题为页面赞数 存储在 Mongo 数据库 JSON 文件中 以下是一个条目的示例 id ObjectId 4725bf8731b8faf4c04595bb user id 0939bf9w980
  • Bash 中按数字文件名排序的 erge 文本文件

    有没有一种方法可以使用一个 bash 命令按文件名的数字顺序连接多个文本文件 我尝试了这个 但由于某种原因 前三行不按顺序 sort n txt gt all txt 添加这个答案只是因为目前接受的答案建议不好的做法 未来 Hellmar
  • CSS 旋转后 Firefox 中的抗锯齿文本

    所以我读了很多关于旋转文本的当前状态的文章 并且无法在所有浏览器中完美地实现真正的抗锯齿功能 它在 Chrome 中看起来像图片中的第一个框 但在 Firefox 中看起来像第二个锯齿状框 我尝试过最流行的修复程序 包括 webkit ba
  • 获取父级的类型

    给定以下课程 template
  • 无法查询表存储中的日期时间列

    我已使用逻辑应用程序中的 formatDateTime 将一列插入到表存储中 并输入正确的值 并且当我查看记录时 列类型显示为 DateTime 但是 当我尝试查询此字段时 它默认为字符串 即使我将其更改为 DateTime 也不会返回任何
  • 为什么编译 Bootstrap 3 RC1 时会出现 Grunt / Recess 错误,而 Lessc 不会出现错误?

    我向 mixins less 添加一些代码 img extend img responsive 也可以看看 Twitter Bootstrap 3 中的图像默认不响应 and https stackoverflow com a 155732
  • 意图服务在打瞌睡模式下不工作

    我的一位同行开发人员写了一篇intent service进行 API 调用 然后休眠 2 分钟 醒来后 再次发送 下面是代码 public class GpsTrackingService extends IntentService Ove
  • 从 woocommerce 中的电子邮件模板中删除订单信息部分

    我正在尝试删除订单信息已完成订单和客户发票电子邮件的部分 在以下位置找不到如何删除它 wp content plugins woocommerce templates emails customer completed order php
  • 无法修复 Digital Ocean Droplet 上的 NGINX 502:错误网关错误 - Ubuntu 20.04

    我已将我的网站部署到 Digital Ocean Droplet Ubuntu 20 04 服务器 一切都工作正常 今天 我在本地机器上对网站做了一些更改 因此 我将更改推送到 GitHub 然后再次将 GitHub 存储库克隆到服务器 然
  • H2DB和Java,大约>两个小时的差异

    我正在开发一个比赛计时系统 在某些情况下 我需要从 H2DB 检索时间对象 与其兄弟 或姊妹 一样 时间数据类型相对于 1970 年 1 月 1 日 并以 hh mm ss 格式在 SQL 中表示 日期默认设置为 01 01 1970 它默
  • Mysql 查询返回资源 id #8 而不是所需的值[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 您好 我正在尝试发现如何修复我的查询以返回正确的结果 这是我的查询 selectShoe
  • 使用python基于两个单词的词频统计

    网上有很多资源展示了如何对单个单词进行字数统计 喜欢this and this and this和别的 但我无法找到两个单词计数频率的具体示例 我有一个 csv 文件 其中包含一些字符串 FileList I love TV show ma
  • 通过 Angular.js 维护会话

    我正在使用 AngularJS 框架开展一个项目 我对使用这个框架还很陌生 过去我只使用纯 JavaScript 和 jQuery 该项目是一种针对利基市场的网页设计师应用程序 当用户在设计时在页面之间移动时 我想维护他们所做的所有更改的会
  • Babel 在运行 Jest 时不会编译 .test.js 文件

    运行yarn run jest no cache时 抛出一个错误 内容如下 SyntaxError Unexpected token import 我最好的猜测是 babel 没有达到这个测试文件 我需要将它们包含在 babelrc 中吗
  • 数据库:SUBSTRING 直到字符第一次出现

    我有字符串类型 abc 01 abcd 01 或 02 现在我想要子字符串 即 abc abcd 等 我正在使用 db2 as400 请建议通过 RIGHT 或 LEFT 函数进行处理 使用 POSITION 内置函数 格式为 POSITI
  • method_missing 覆盖不起作用

    我编写了一个方便的 ActiveRecord 扩展来将方法委托给基础对象 基于多表继承 class ActiveRecord Base def self acts as base class eval Q def method missin
  • 使用seaborn.swarmplot 将数据点映射到颜色图

    我想生成一个seaborn swarmplot 其中单个数据点的颜色映射到颜色图 我有一个与此类似的数据框 In 48 df Out 48 a c Key 0 1 12 1st 1 4 35 2nd 2 5 12 2nd 3 6 46 1s
  • Angular 2 ng 模块导入

    当我们在顶部导入文件时 导入 ngmodule 装饰器的元数据有什么意义 两个输入之间的差异 这些导入是完全不同的概念 文件顶部的导入是 TypeScript 导入 以使当前文件已知的类 接口和变量 与 Angular2 无关 The Ng
  • Android中使用WallpaperManager设置壁纸

    以下是我的代码 我想使用壁纸管理器设置为壁纸 我在用着通用图像加载器 但我不知道如何实现壁纸管理器 我的 setWall 不起作用 有点令人困惑 import android graphics Bitmap import android o
  • 智能编译器是否可以在不成为语言一部分的情况下完成 std​​::move 所做的所有事情?

    这是一个有点理论上的问题 但是尽管我对 std move 有一些基本的了解 但我仍然不确定它是否为该语言提供了一些理论上无法通过超级智能编译器实现的附加功能 我知道这样的代码 std string s1 STL std string s2