从常量引用中移动构造

2024-04-06

我遇到以下情况,需要从 t1 中移动构造 t2。 不幸的是,这是不可能的(我想是违反常量的)
从 foo 的调用者那里透明地处理这个问题的正确方法是什么? (即不需要传值和显式 std::move)

struct T
{
    T() = default;
    ~T() = default;
    T(T&&) = default;
};

T foo(const T& t) 
{
    T t3;

    if (predicate)
        return t3;
    else
        return std::move(t);
}

int main()
{
  T t1;
  T t2 = foo(t1);

  return 0; 
}

从 foo 的调用者那里透明地处理这个问题的正确方法是什么?

你不能那样做,而事情本来就是这样的。左值永远不会被透明地移动。

由于移出的对象通常处于未知(但合法)的状态,因此如果客户端可以将左值作为参数传递给函数,并且允许该函数默默地从它移出,那将是危险的。客户端可能会在不知情的情况下留下一个僵尸对象!

因此,该语言强制执行以下规则:从左值移动必须是有意识的行为,并且应通过调用将左值显式转换为右值(实际上是 x 值)来发生std::move().

在这种情况下,我会说你的功能foo()- 无论它实际上应该做什么 - 应该采用右值引用,并且客户端应该像这样调用它:

T t2 = foo(std::move(t1)); 

请注意,一旦您使用无意义的名称(例如),最后的建议可能不正确foo()转化为反映某些具体程序中某些特定操作的语义的东西。然而,在不知道该操作的含义是什么的情况下,我只能提供关于如何编译代码片段以及如何总体考虑移动语义的正式、机械的建议。

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

从常量引用中移动构造 的相关文章

  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 使用restsharp序列化对象并将其传递给WebApi而不是序列化列表

    我有一个看起来像的视图模型 public class StoreItemViewModel public Guid ItemId get set public List
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 将字符串格式的日期转换为字符串日期前一天的 nsdate 结果

    我搜索了我的问题 但没有找到任何相关的帮助 故事 用户按名称 开始日期 结束日期和注释创建连续事件 因此将所有字段保存在 Sqlite 数据库中 两个日期格式均为 yyyy MM dd 之后 当用户想要对事件执行操作时 应用程序会检查用户选
  • 如何使用 OpenCV triangulatePoints

    我正在努力获取 OpenCVtriangulatePoints功能来工作 我正在使用该函数与光流生成的点匹配 我使用来自单个移动摄像机的两个连续帧 位置 目前 这些是我的步骤 给出了内在函数 看起来就像人们所期望的那样 2 6551e 00
  • 动态为mysql查询中的所有字段名分配别名

    我的 mysll 数据库中有 2 个表 两个表都有很少的固定列和很少的动态列 字段 架构 我想用以下查询连接这两个表 SELECT FROM cd cd LEFT JOIN cd n cn ON cd id cn fk cd 我想要的结果是
  • 在新维度中堆叠数组

    假设我有三个数组 k np array 1 1 2 2 m np array 3 3 4 4 n np array 5 5 6 6 理想情况下 我希望获得形状为 3 2 2 的最终数组 即 array 1 1 2 2 3 3 4 4 5 5
  • Scala 模式匹配引用

    当模式匹配案例类时 您实际上如何引用它所匹配的类 这是一个例子来说明我的意思 sealed trait Value case class A n Int extends Value v match case A x gt doSomethi
  • 大对象不能在自动提交模式下使用

    我正在开发一个使用 spring 和 hibernate 的应用程序 我们使用 postgresql 作为数据库 当我尝试将记录插入到具有 OID 列的表中时 会引发以下错误 org hibernate exception GenericJ
  • 未处理的异常:无法测试没有大小的渲染框

    所以我正在尝试重新创建一个 UI 模板 这是代码 我试图通过调用RecentlyViewed 添加另一个水平GridView 但重新加载后它无法呈现 我不知道如何渲染它 我尝试过使用扩展的小部件和灵活的但都不起作用 return Scaff
  • iOS:UICollectionViewCell根据屏幕尺寸自动调整大小

    我试图在集合视图中创建 10 个单元格 与屏幕大小相同 当我在 iphone5s 模拟器中运行我的应用程序时 视图恰好包含 5 个单元格 但是当我切换到 iphone6p 模拟器时 视图包含超过 5 个单元格 我应该如何调整单元格大小 以使
  • 在按钮上应用滤色器

    我有很多带有很多不同背景颜色的按钮 我想知道是否有办法在点击时应用一些滤色镜 例如 我希望所有按钮在单击时变得更暗 它们保留了原来的颜色 但颜色更深了 有没有一种简单的方法可以做到这一点 或者我必须为每个按钮定义较暗的颜色 Thanks 我
  • 制作一个包含我的列表项的文本文件并对其应用正则表达式

    我应该编写一个代码来读取包含一些具有一些常见语言特征的单词的文本文件 对所有单词应用一些正则表达式 并写入一个包含更改后的单词的文件 现在假设我的文本文件名为abcd txt有这些话 king sing ping cling booked
  • Popen.communicate() 抛出 UnicodeDecodeError

    我有这个代码 def executeCommand self command str input str None gt str p sub Popen command stdout sub PIPE stderr sub PIPE std
  • 在 Windows 窗体中列出(顶级)声明的变量

    创建表单的实例后 我可以轻松列出表单中的所有控件 有没有什么机制可以列出所有声明的变量或这样的物体 也许我会称它为声明 仅顶层声明就足够了 假设我们有MyForm具有此类顶级声明的表格 Dim Town as String Dim ZIP
  • 输出路径和 MSBuild

    我有一个包含 9 个项目的解决方案 每个项目中的所有引用都将其 CopyLocal 属性设置为 False 当我从 VS 构建它时 这些引用的二进制文件都不会复制到输出构建目录 同样 当我使用 msbuild 进行构建时 我只看到项目二进制
  • 使用现有表单将数据发送到 mailchimp,然后重定向

    我没有经常使用我的 mailchimp 所以我想知道是否可以在不使用预制模板的情况下轻松地将表单数据发送到 mailchimp 另外 mailchimp 会发送某种回调吗 我想提交表单 然后完成后它将用户重定向到下载页面 如果能在 ajax
  • 如何通过Linux中的终端检查窗口是否最小化

    如何通过 Linux 中的终端检查窗口是否最小化 name Window Title grep Map State 寻找IsViewable versus IsUnMapped 这些来自map state返回的字段XGetWindowAtt
  • Serilog:{..} 和 {@..} 之间的区别

    鉴于此代码 var d1 new x 5 y 88 Log Logger Information d1 d1 Log Logger Information d1 d1 d1 中的对象如何在两条 Log Logger Information
  • 如何找到阶乘? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何编写一个程序来求任意自然数的阶乘 这适用于正整数的阶乘 尽管是一个非常小的子集 unsigned long factorial u
  • 如何制作“搜索框,根据输入字符串上的 API 调用获取数据检索显示动态选项列表”,如 amp 邮件中的 select2

    我对 AMP 电子邮件技术非常陌生 我面临着与在搜索框中呈现动态选项相关的问题 这使得根据输入字符串获取 API 请求调用作为查询 并根据请求检索的数据显示选项列表 我发现 amp autocomplete 在 amp email 中不起作
  • 为什么我的 PHP 交易不起作用?

    我正在开展一个学校项目 为我的作品集网站创建 CMS 我的更新功能无法正常工作 我有一种感觉 这与我构建 PDO 事务的方式有关 在我的数据库中 我有一个项目表 类别表和关联的 content category 表 我可以很好地将我的项目插
  • 从常量引用中移动构造

    我遇到以下情况 需要从 t1 中移动构造 t2 不幸的是 这是不可能的 我想是违反常量的 从 foo 的调用者那里透明地处理这个问题的正确方法是什么 即不需要传值和显式 std move struct T T default T defau