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

综合移动构造函数的行为

南门星河
2023-03-14

我正在读《C入门》第五版,遇到了以下问题。本书列出了将合成移动操作定义为已删除的几种情况。其中之一就是与复制构造函数不同,如果类有一个成员定义了自己的复制构造函数,但没有定义移动构造函数,或者类有一个成员没有定义自己的复制操作,并且编译器无法为其合成移动构造函数,则移动构造函数被定义为已删除。同样,移动分配也是如此。“并提供如下演示代码:

// assume Y is a class that defines its own copy constructor but not a move constructor
struct hasY {
    hasY() = default;
    hasY(hasY&&) = default;
    Y mem; // hasY will have a deleted move constructor
};
hasY hy, hy2 = std::move(hy); // error: move constructor is deleted

然而,对于gcc 7.2.1和clang-900.0.37,代码都是可运行的,这本书是错的吗?

以下是完整的测试代码:

#include <iostream>

struct Y {
    Y() { std::cout << "Y()" << std::endl; }
    Y(const Y&) { std::cout << "Y(const Y&)" << std::endl; }
    //Y(Y&&) { cout << "Y(Y&&)" << endl; }
};

// assume Y is a class that defines its own copy constructor but not a move constructor
struct hasY {
    hasY() = default;
    hasY(hasY&&) = default;
    Y mem; // hasY will have a deleted move constructor
};

int main() {
    hasY hy, hy2 = std::move(hy); // error: move constructor is deleted
    return 0;
} 

共有1个答案

车子平
2023-03-14

这本书正确地描述了C11标准规定的行为。但是,从C 14开始,规定的行为已经改变,它采用了缺陷报告#1402“移动功能太频繁地删除”的解决方案

 类似资料:
  • 问题内容: 我有一堂课。 在我的类方法中,我实例化该类,如下所示: 编译器将此代码转换为: 使用反射表明该类具有以下综合的构造函数: 由于该类是,因此编译器会将该构造函数添加到该类中,因此没有人可以实例化该类。但是很明显,该类应该能够实例化它,因此编译器添加了另一个包私有构造函数,后者又调用了私有构造函数。另外,由于package- private构造函数的名称中包含该名称,因此普通的Java代码

  • 引用自C Primer 如果我们显式地要求编译器使用生成移动操作,并且编译器无法移动所有成员,那么移动操作将被定义为删除 如果类有一个定义自己的复制构造函数的成员,但不定义移动构造函数,或者如果类有一个不定义自己的复制操作的成员,并且编译器无法合成,则移动构造函数被定义为删除移动构造函数 有些代码似乎违反了这条规则: X没有定义移动构造函数,编译器不能为它合成一个。 根据上述规则,的移动构造函数被

  • 我试图理解“有效现代C”中关于特殊成员函数生成的第17项,所以我尝试了一些示例,并试图对一些行为进行推理。书中说: ..当我提到移动操作move构造或移动分配一个数据成员或基类时,不能保证实际会发生移动。“Memberwise移动”实际上更像Memberwise移动请求,因为未启用移动的类型(即,对移动操作不提供特殊支持的类型,例如大多数C 98遗留类)将通过其复制操作“移动”。。。此外,不会为任

  • 问题内容: 只有最后一部分(我的意思是我仅对此有问题) 当我编译它时,我没有合适的构造函数错误。为什么是这样??顺便说一下,Spirtokouto类的目的是要增加一个计数值(权重)。我可以将一个班级扩展到> 1个班级吗? 问题答案: Box类有两个构造函数:,但它们都不带四个参数,而您要用四个参数来调用它,因此请更改此参数: 对此: 调用必须首先在构造函数中进行。 我可以将一个班级扩展到 > 1个

  • 似乎一个向量会检查move构造函数是否标记为noexcept,然后再决定重新分配时是移动还是复制元素。默认的移动构造函数是否定义为noexcept?我看到了以下文档,但它没有指定这一点。http://en.cppreference.com/w/cpp/language/move_constructor 隐式声明移动构造函数 如果没有为类类型(struct,类或联合),并且以下所有都是真的:没有用户

  • web3.eth.Contract类简化了与以太坊区块链上智能合约的交互。创建合约对象时, 只需指定相应智能合约的json接口,web3就可以自动地将所有的调用转换为底层 基于RPC的ABI调用。 通过web3的封装,与智能合约的交互就像与JavaScript对象一样简单。 实例化一个新的合约对象: new web3.eth.Contract(jsonInterface[, address][,