类是可移动构造和可赋值的,即使我实现了复制赋值操作符 在C++程序设计语言第四版中,作者表示

类是可移动构造和可赋值的,即使我实现了复制赋值操作符 在C++程序设计语言第四版中,作者表示,c++,C++,•如果程序员为类声明复制操作、移动操作或析构函数,则不会为该类生成复制操作、移动操作或析构函数 •如果程序员为类声明任何构造函数,则不会为该类生成默认构造函数 所以我试图看到它的实际应用,所以我实现了书中的一个例子,一个简单的类,它有一个std::vector成员,一个默认构造函数和一个拷贝赋值操作符的实现 包括 包括 包括 类抽搐{ 公众: tic:p9{} tic&operator=const tic&t{ forint i=0;i

•如果程序员为类声明复制操作、移动操作或析构函数,则不会为该类生成复制操作、移动操作或析构函数

•如果程序员为类声明任何构造函数,则不会为该类生成默认构造函数

所以我试图看到它的实际应用,所以我实现了书中的一个例子,一个简单的类,它有一个std::vector成员,一个默认构造函数和一个拷贝赋值操作符的实现

包括 包括 包括 类抽搐{ 公众: tic:p9{} tic&operator=const tic&t{ forint i=0;i
更明确地说,您可以将移动分配运算符设置为“已删除”。这样,它将参与重载解析,并且移动分配检查将失败。

遗憾的是,我没有完全理解,但我可以推断这并不意味着默认情况下实现了移动语义,我仍然必须实现它们,否则它将只是复制,是吗是吗?@user442029是的,创建复制分配运算符将禁止创建默认的移动分配运算符。您必须自己实现它。或者您可以按照,让编译器自己创建复制/移动分配运算符。您的std::vector数据成员已具有复制和移动语义,因此您实际上不需要在您的类中实现该运算符。只要让编译器编写它,一切都会好起来。是的,本章讨论的是零规则,我知道该怎么做,奇怪的是,即使我违反了该规则,编译器还是创建了移动语义。谢谢。@user442029如果我有tic foo;并且我做foo=tic,这个将调用您在示例中定义的运算符copy assignment运算符。该运算符const tic&的参数仍然可以接受一个右值,例如tic。此代码中没有移动语义,编译器仍将创建一个与执行tic bar;foo=bar;相同的副本。复制构造函数匹配一个移动请求。如果类h作为复制和移动构造函数,重载解析将为移动请求选择后者。std::is_move_constructible不是has_move_构造函数,但请回答以下问题:它可以从r值构造吗。