当前位置: 首页 > 知识库问答 >
问题:

MSVC不能返回可以复制但不能移动的对象

司马念
2023-03-14
class Obj {
 public:
  Obj() = default;

  Obj(Obj&&) = delete;
  Obj(const Obj&) { std::cout << "Copy" << std::endl; }
};

Obj f1() {
  Obj o;
  return o; // error C2280: move constructor is deleted
}

Obj f2() {
  Obj o;
  return Obj(o); // this however works fine
}

int main() {
  Obj p = f1();
  Obj q = f2();

  return 0;
}

GCC和Clang接受此代码,并且能够在这两种情况下使用复制省略。

F1()中,MSVC抱怨无法返回O,因为删除了obj的move构造函数。但是,我希望它能够依靠复制构造函数。这是MSVC中的一个bug,还是这个想要的行为(我不明白)和GCC/Clang太允许了?

如果我提供了一个move构造函数,MSVC就可以在编译为release时省略move。

共有1个答案

西门飞翮
2023-03-14

F1()上缺少错误是clang和GCC中的一个bug。它被固定在Clang的树干尖端。

F1()不符合强制删除复制的条件。

删除的函数参与重载解析。如果选择它们作为最佳重载,则程序格式不良。在F1()中,通过重载解析选择已删除的move构造函数。

 类似资料:
  • app.py reg_account.html 错误: 我想让的结果在中的复选框未选中时返回False,但我不明白为什么当我勾选了该复选框时,结果可以存储到数据库中?我试着调试了几次,但还是找不到一个可能的解决方案,所以有没有人可以帮忙?

  • 我正在从第三方网站(家庭用电)检索JSON,根据我从网站请求的内容,返回的JSON可能是也可能不是数组。例如,如果我请求我的智能电表列表,我会得到这个(由于尺寸大,结果被截断): 其中 gwrcmd 是单个元素。 但是如果我要求过去半个小时的用电,我会得到这个: 看看 gwrcmd 现在是一个数组吗? 在我的Go应用程序中,我有一个类似这样的结构(再次,被截断,因为它持续了一段时间。“版本”下有更

  • 我买了新的MacBook Pro,我在其中安装了mysql,然后安装sequel Pro来查看表和数据库,但是当我命令时,这个错误指控错误图像 近30个小时来,我一直在忍受这个问题,有人能帮我看一下吗

  • 我有一个类包含一个,因此它不可移动或复制。 我可以轻松地将此对象添加到此地图: 但是我想用一个来保存其中的几个: 如果是可移动的,那么我可以: 但是当不可移动时,这就不起作用了(正如预期的那样)。我不能退回到分段构造,因为std::array不能从3个字符串的元组构造。 有没有一种方法可以在地图中构建一个由不可移动对象组成的? 我用这些问题作为参考。有没有办法把答案结合起来? 安置和无序的地图 如

  • 我已经成功地将Zimbra LDAP服务器复制到独立的OpenLDAP服务器。我计划将复制服务器用作我们内部应用程序身份验证服务的中央LDAP服务器。 复制Zimbra LDAP的步骤如下:1。安装新的OpenLDAP服务器。2.将所有模式定义从Zimbra复制到新服务器3。使用olcsuffix:“”添加新数据库,并添加复制和其他配置: 我成功地将Zimbra的所有数据复制到了新的LDAP服务器

  • 编辑:getResourceAsStream()与FileInputStream 这是我找到的最好的解释。就我个人而言,在尝试了InputStream的所有不同子类后,我觉得FileInputstream()返回的InputStream和getResourceAsStream()返回的InputStream的实现在某些方面略有不同(导致与javax.xml.parsers.不兼容)。 我会把这个打