当现在允许使用虚拟基地移动分配运算符时,会有危险吗?

2024-05-07

这涉及到C++问题的解决http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1402 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1402。概括:

template<typename T>
struct wrap
{
   wrap() = default;

   wrap(wrap&&) = default;
   wrap(const wrap&) = default;

   T t;
};

struct S {
   S(){}
   S(const S&){}
   S(S&&){}
};

typedef wrap<const S> W;

// Error, defaulted move constructor of "wrap<const S>" is deleted!
W get() { return W(); }

(问题是,即使编译器可以简单地使用“S”的复制构造函数,就像用户显式编写“wrap”的移动构造函数时一样,我们也会收到此代码片段的错误。该问题已解决在重载决策期间忽略已删除的移动构造函数(和赋值运算符),因此根据需要使用上面的复制构造函数。)

当决议已起草,提出以下意见 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3667.html关于该决议:

相对于复制,隐式/默认移动操作没有其他限制。这意味着虚拟基中的移动赋值是危险的(编译器可能应该警告)[...]但我们在 Batavia 决定不保留所有 C++03 代码以防止隐式移动操作,我认为该分辨率提供了显着的性能优势。

有人可以描述一下虚拟基地移动分配操作员的担忧是什么吗?


考虑:

#include <iostream>

struct A
{
    A() = default;
    A(const A&) = default;
    A(A&&) = default;
    A& operator=(const A&) {std::cout << "operator=(const A&)\n"; return *this;}
    A& operator=(A&&) {std::cout << "operator=(A&&)\n"; return *this;}
};

struct B
    : virtual public A
{
};

struct C
    : virtual public A
{
};

struct D
    : public B,
      public C
{
};

int
main()
{
    D d1, d2;
    d1 = std::move(d2);
}

我相信这个程序应该输出:

operator=(A&&)
operator=(A&&)

对我来说它实际上输出:

operator=(const A&)
operator=(const A&)

但我认为这只是一个 clang bug(用 -std=c++1y 编译)。如果我对输出应该是什么是正确的,那么危险就是移动赋值运算符被调用两次。这对于复制赋值运算符是无害的(尽管可能很昂贵),但对于移动赋值运算符则不然。

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

当现在允许使用虚拟基地移动分配运算符时,会有危险吗? 的相关文章

随机推荐

  • Spring 3 JSR-286(portlet)文档

    我知道Spring 3支持JSR 286 portlet 版本 2 0 但是我找不到很多这方面的文档 任何人都可以分享一些关于此的链接吗 谢谢 找到几个教程 使用 Spring 3 MVC Portlet 的 Hello World htt
  • 配置解析器和带 % 的字符串

    愚蠢的问题 当然 简单的答案 我正在使用 configparser 从文件中读取一些字符串 当字符串具有 符号 例如 时 它会抱怨 ConfigParser InterpolationSyntaxError 后必须跟 或 找到 有人熟悉这个
  • 防止打开 VB 应用程序的多个实例

    我的 VB6 应用程序由 MS Access 数据库支持 允许用户打开应用程序的多个实例会产生冲突并更改连接的数据库 理想的解决方案是 如果用户尝试打开新实例 则关注现有实例 我怎样才能达到这个目的 Use App PrevInstance
  • Spark 中的广播 Annoy 对象(对于最近邻居)?

    由于 Spark 的 mllib 没有最近邻居功能 我正在尝试使用Annoy https github com spotify annoy为近似最近邻 我尝试广播 Annoy 对象并将其传递给工人 然而 它并没有按预期运行 下面是可重复性的
  • 删除重载、递归溢出

    嘿伙计们 我写了一个快速测试 我想删除调用deleteMe 然后它会自行删除 这样做的目的是让我可以正常删除由lib分配的obj 我不希望因 crt 或 w e 导致任何崩溃 通过删除这个 我得到了一个堆栈溢出 没有它 msvc 说我泄漏了
  • 无法从 AsyncTask 启动服务

    我正在尝试从 AsyncTask 启动服务 但看不到它的启动 我还在清单文件中添加了服务 这里是代码 protected Integer doInBackground Void values throws InterruptedExcept
  • 使用 SAS 导出到 Excel

    假设我有 2 个 SAS 数据集 test1 sas 和 Test2 sas 现在我想将这2个数据集导出到Excel中 其中Excel文件Sheet1中将有test1 sas数据 Sheet2中将有test2 sas数据 怎么做 从 开始这
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • 关键词是真还是假?

    Are true and falseJava 中的关键字 这是完整的列表Java 语言关键字 http java sun com docs books tutorial java nutsandbolts keywords html 特别要
  • Javascript:确认、确定、取消按钮上的自定义文本

    我有一个验证 我想显示 继续 和 返回 而不是 确定 和 取消 但我无法找到准确的解决方案 任何人都可以帮助我
  • 嵌套列表递归python的序列

    给定一些数字 n 我想生成一个大小为 n 的列表 其中以下示例显示列表中的第 n 个元素应该如何 对于 n 0 返回 对于 n 1 返回 对于 n 2 返回 对于 n 3 返回 基本上 它采用先前的列表并将它们附加到新列表中 我尝试过以下方
  • com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:连接关闭后不允许执行任何操作

    我构建了一个应用程序并在本地部署 并且它运行良好 我将其部署在远程服务器上 并开始收到主题行中提到的异常 这不是因为任何防火墙问题 我改变了我的hibernate xml通过我的 IP 地址而不是 localhost 进行连接 现在我在本地
  • Trace.Assert 没有中断,也不显示消息框

    我有一个 WPF 应用程序 我在其中在画布上移动数据 当我像怪物一样尝试用鼠标移动数据时 问题就开始了 以下是操作的顺序 画布上的 MouseMove 被触发 在 MouseMove 中 我更改了一些数据 Trace Assert 失败 调
  • 在 Ember 中将模型属性插入 Img 元素 URL

    我有一个模型image id财产 我有一个包含图像元素的模型视图 我需要将 id 插入图像元素的src属性来完成图像的 URL 以便我有效地执行此操作 img src 我的第一次尝试使用了 Handlebars 助手 img src 但这也
  • 如何列出所有可用的打印机驱动程序,例如 C# 中的“添加打印机向导”?

    很可能我必须为此编写一些过于复杂的东西 并且没有常规的方法来做到这一点 但是 我怎样才能获得所有可用打印机驱动程序的列表 就像添加打印机向导按制造商然后按打印机显示驱动程序时所做的那样 我基本上需要一个自定义的添加打印机对话框 如果没有这个
  • 在 Solidity 中初始化一个大的固定长度数组

    我正在以太坊上构建一个游戏作为我的第一个项目 但我面临着存储和天然气限制 我想在区块链上存储一个存储智能合约 以便在部署后查询 我确实需要使用手动插入的常量值来初始化固定长度数组 我的情况如下 contract A some states
  • 在php中将图像添加到Excel中 php中的excel

    我举的例子是phpexcel https phpexcel codeplex com 我刚刚尝试在 GET 方法中传递值 我已经完成了 现在我正在尝试在 a3 列中添加图像 参考代码
  • 迁移到 AndroidX 后 Google 登录无法正常工作

    我已将 Google Sign 集成到我的 Android 应用程序中 当我使用 spp Compact v28 库时它工作得很好 但在将我的应用程序迁移到 androidx 后失败 但出现以下异常 java lang Incompatib
  • xslt 匹配过滤结果集的前 x 项

    对 xslt 很陌生 所以如果这是一个基本问题 请原谅我 我无法在 SO 上或通过 Google 搜索找到答案 我想要做的是返回一组经过过滤的节点 然后对该组中的前 1 或 2 个项目进行模板匹配 然后另一个模板与其余项目匹配 但是如果没有
  • 当现在允许使用虚拟基地移动分配运算符时,会有危险吗?

    这涉及到C 问题的解决http www open std org jtc1 sc22 wg21 docs cwg defects html 1402 http www open std org jtc1 sc22 wg21 docs cwg