在 C 98 中,编译器可以通过成员方式复制自动创建复制构造函数和复制赋值运算符。随着移动语义的引入,这个过程扩展到了 C 11。但是,自动生成移动操作的规则与复制操作的规则不同。
Howard Hinnant 的 ACCU 2014 演示文稿提供了这些规则的简要概述。下表总结了要点:
</p> <table> <thead><tr> <th> </th> <th>Destructor</th> <th>Move Constructor</th> <th>Move Assignment Operator</th> </tr></thead> <tbody> <tr> <td>C 98/03</td> <td>No</td> <td>Yes</td> <td>Yes</td> </tr> <tr> <td>C 11 (Defect Report 1492)</td> <td>Yes</td> <td>No</td> <td>No</td> </tr> <tr> <td>C 11 Final</td> <td>Yes</td> <td>Yes<sup>*</sup> </td> <td>Yes<sup>*</sup> </td> </tr> </tbody> </table> <p>
是:自动生成。
否:不会自动生成。
*但仅隐式定义(未声明或声明=默认)。显式定义抑制生成。
这些规则表明,虽然移动构造函数和移动赋值运算符通常在 C 11 中自动生成,但在某些情况下可能不会自动生成。例如,如果显式定义了析构函数,则不会生成移动操作。同样,显式定义移动操作本身会抑制自动生成。
以上是C 98 和 C 11 之间的自动移动操作生成规则有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!