当变量在初始值设定项列表中使用时,为什么 C++ 不知道在返回中执行隐式移动?

2024-01-06

考虑this https://godbolt.org/z/7aKq7v code:

#include <iostream>
template<typename A>
struct S{
    S(const A& a){
        std::cout << "L\n";
    }
    S(A&& a){
        std::cout << "R\n";
    }
};
S<int> f1(){
    int a = 1;
    return {a};
}
S<int> f2(){
    int a = 1;
    return a;
}
S<int> f3(){
    int a = 1;
    return {std::move(a)};
}
int main()
{
    f1();
    f2();
    f3();
}

输出是

L
R
R

正如您可能知道的,C++ 隐式地在返回中移动(在 f2 中)。当我们在初始化列表中手动执行此操作时,它可以工作(f3),但它不是由 C++ 在 f1 中自动完成的。

是否有充分的理由说明这不起作用,或者这只是一个被认为不够重要而无法由标准指定的极端情况?

附:我知道编译器可以(有时必须)执行 RVO,但我不知道这如何解释输出。


好的一点是:

return name;

这是一个简单的推理案例:显然,您只是按名称返回一个对象,这里根本没有其他恶作剧发生。然而,这个具体案例却导致patch https://wg21.link/cwg1579 after patch https://wg21.link/p0527 after patch https://wg21.link/p1155 after patch https://wg21.link/p2266。所以,也许毕竟没那么简单。

一旦我们在此之上添加任何进一步的复杂性,事情就会变得更加复杂。

返回初始化列表后,我们必须开始考虑各种其他情况:

// obviously can't move
return {name, name};       

// 'name' might refer to an automatic storage variable, but
// what if 'other_name' is an alias to it? What if 'other_name'
// is a separate automatic storage variable but is somehow
// dependent on 'name' in a way that matters?
return {name, other_name}; 

你只是...无法知道。这only我们绝对可以考虑的情况是由单个名称组成的初始值设定项列表:

return {name};

这种情况可能可以隐式地转移。但问题是,在这种情况下,你可以移动:

return {std::move(name)};

问题具体与return name;情况是这样的return std::move(name);有时是强制性的,有时是悲观的,我们希望得到这样的观点:你总是只写一件事并获得最佳行为。这里就不存在这样的顾虑了return {std::move(name)};不能以同样的方式抑制复制省略。所以写这个就不是什么问题了。

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

当变量在初始值设定项列表中使用时,为什么 C++ 不知道在返回中执行隐式移动? 的相关文章

  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • 生成多个随机数

    我想生成 25 个唯一的随机数并将它们列在控制台中 数字的长度应至少为 10 个字符 有什么简单的方法可以做到这一点吗 尝试将数字构建为字符串 并使用 HashSet 确保它们是唯一的 Random random new Random Ha
  • 深拷贝和动态转换 unique_ptr

    假设我有一个如下所示的类 class A virtual A class B public A class C public A 我还有一个 unique ptr 向量 它是这样声明的 std vector
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • C# 无法捕获 SerializationException

    我的程序在加载序列化文件的部分遇到问题 如果文件无法反序列化 我希望很好地失败 但由于某种原因 我的程序将中断而不是进入 catch 子句 这是我的代码 using FileStream fs new FileStream openFile
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 在c#中获取没有时间的日期

    我的表上有一列 缺勤日期时间 日期 当我想要获取包含日期的行时 它返回 0 行 这是我的 C 代码 DateTime ClassDate DateTime Parse lblDate Content ToString var Abs dbs
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • C 变量声明的效率 [重复]

    这个问题在这里已经有答案了 例如 在 C 中声明一个变量需要多长时间int x or unsigned long long var 我想知道它是否会让我的代码在类似的事情中更快 for conditions int var 0 code 这
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找

随机推荐

  • 使用 Gradle 覆盖 GCM 权限包前缀

    我有一个 Gradle Android 项目 有 4 种产品风格 每种产品都有自己独特的包名称 这build gradle文件的性质非常简单 buildscript repositories mavenCentral dependencie
  • 将 DataTable 导出到 CSV 时出现逗号问题

    我采用了一些将 DataTable 转换为 CSV 文件的代码 它似乎工作得很好 除了在实际数据中使用逗号时 在这种情况下有没有办法显示逗号 这就是我所做的 StringBuilder sb new StringBuilder IEnume
  • 了解 gc.get_referrers

    我正在尝试跟踪 Python 2 7 中的内存泄漏 我找到了 gc get referrers 但不理解输出 删除后dying node 除了我在狩猎过程中创建的列表之外 这应该删除所有引用 我的代码中有 gc collect print
  • 在 wpf 应用程序中安装窗口服务

    我有两个项目 wpf 和 windows 服务 我已经为 wpf 项目创建了设置 我想使用 wpf 项目安装来安装窗口服务 即一旦用户安装 wpf 项目 窗口服务将自动安装 是否可以 请建议 Thanks None
  • 从相机捕获的iphone图像自动旋转-90度

    以编程方式 我已在应用程序中从相机中获取图像 它已经很好地获取了 但是当我切换到另一个视图并关闭该视图时 我的图像会自动旋转 90 度 这种变化仅在我移动之后第一次发生 当我移动时 没有发生任何变化意味着图像保持在 90 度状态 并且仅当我
  • 如何在 T-SQL 中用年、月、日计算年龄

    在 T SQL SQL Server 2000 中计算某人年龄 以年 月和日为单位 的最佳方法是什么 The datediff函数不能很好地处理年份边界 而且将月份和日期分开将是一个麻烦 我知道我可以相对轻松地在客户端完成此操作 但我希望在
  • PyQt:QGraphicsView中的鼠标事件

    我想用 PyQt 用 Python 编写一个简单的程序 我有一个 QGraphicsScene 我想执行以下操作 使用两个单选按钮有 2 个选项 用于生成点 这样 如果有人单击场景 就会出现一个椭圆 用于选择点 这样 如果有人单击某个点 将
  • 如何从 Linux 帧缓冲区获取 RGB 像素值?

    我想使用 Linux 以最有效的方式获取屏幕像素的 RGB 值 所以我决定使用C中的framebuffer库 fb h 访问帧缓冲设备 dev fb0 并直接从中读取 这是代码 include
  • 如何在VS Code的集成终端中正确显示unicode字符?

    根据标题 我似乎无法让 VS Code 集成终端正确显示 unicode 字符 它们在集成终端中始终显示为问号 我已确保文件以编码方式保存UTF 8这似乎是迄今为止我所看到的所有答案中建议的唯一解决方案 但无济于事 System out p
  • 调试错误 -Abort() 已被调用

    我正在尝试输入一个数字 n 并获得大于或等于 n 的最小超级幸运数字 超级幸运 它的十进制表示包含等量的数字 4 和 7 例如 数字 47 7744 474477 是超级幸运 而 4 744 467 则不是 这是我的代码 include
  • Swiftui 列表行单元格在视图出现后设置填充

    我有一个标准列表 仅包含一个文本 右侧有用于导航的箭头 但是在列表加载并出现在屏幕上后 列表会适应单元格 我认为它们在左侧和右侧添加了填充 但这看起来不太好 所以看起来列表滞后 List ForEach 0
  • 两个文件夹之间的 Git 合并,而不是分支

    假设以下场景 我有一个 git 项目 其目录名为project 在这个目录中我做了一些提交 然后 与cp r我将此目录复制到一个名为的目录project with feature b 即我手动创建了一个分支 现在我想合并这两个文件夹 就像它
  • 使用 dtmf 进行 Windows Phone 电话通话

    我知道使用电话呼叫任务 我们可以通过填写电话号码字段以编程方式拨打电话 示例代码可能是 PhoneCallTask phn new PhoneCallTask phn PhoneNumber 9807689 657 phn show 但我的
  • 使用 FFMPEG 从图像生成 2-fps mp4

    需要从一系列图像创建视频 视频需要具有低帧速率 这是我用来创建视频的命令 ffmpeg exe r 2 i images 3d jpg vcodec libx264 pix fmt yuvj420p output mp4 问题是 虽然通过
  • 如何让 webpack“实际上”忽略外部并依赖浏览器导入?

    我试图让 webpack 忽略导入 以便浏览器使用本机 ES6 import 语句而不是 webpack 导入它 我试图让 ffmpeg js 直接导入 因为它在尝试捆绑 webpack 时崩溃 因为文件太大 按照这里的答案 如何从 web
  • 如何在没有多个实例的情况下使用嵌套手风琴菜单?

    这是我的基地 http jsfiddle net UnV4Z http jsfiddle net UnV4Z 我希望它是三个级别 而不是只有两个级别 我已经在这里工作了 http jsfiddle net RnwYQ 13 http jsf
  • 直接将 gz 文件加载到 pandas dataframe 中

    我有这个gz file https www dropbox com s d18iqa21z2nxp8h DCCV OCCUPATIT 20 20 20Employment 20 20 20 20 20 20 20 20 20 20 20 2
  • 如何在 css 模块文件中设置非散列类的样式?

    我正在使用 css 模块 并且有一个包含两个类的 React 组件 一 使用 css 模块进行哈希处理 另一个 未散列 因为它来自另一个函数 假设它是 clear class div qwerty div 我的 scss 文件看起来像这样
  • 如何隐藏图表工具提示的标题?

    我正在使用图表 js 显示分组条形图并尝试隐藏工具提示的标题 生成栏的代码 var ctx document getElementById myChart getContext 2d var data labels Chocolate Va
  • 当变量在初始值设定项列表中使用时,为什么 C++ 不知道在返回中执行隐式移动?

    考虑this https godbolt org z 7aKq7v code include