c++ - 是 *this = Ctor();清除对象状态合法有效?

标签 c++ constructor language-lawyer c++17 this-pointer

我偶然发现了这段代码来重新建立类不变量:

class Foo {
  // some stuff in here
public:
  void clear() {
    *this = Foo();
    //operator=(Foo()); // commented out in favor of the line above
  }
};
  • 我假设对 operator= 的调用是合法的并且按预期工作,但会创建一个不必要的临时文件,以防类不可移动。因此,手动分配默认值可能会更有效,如果我们想扩展类,这很麻烦且容易出错。
  • *this = Foo(),如果允许的话,可能会更有效,因为我假设复制省略可以在这里工作(不管类是可移动的)。

所以我的问题是:

  • *this = Foo(); 语句是否合法?如果是,请提供标准引用
  • 什么更有效(前提是第一个要点是正确的)?
  • 如果 Foo 是可移动的。
  • 以防万一。

最佳答案

  • Is the statement *this = Foo(); legal? If yes, please provide a reference to the standard

这是合法的。它遵循可以通过解除引用的指针分配值的标准。

我不认为我们可以在 c++ 标准中找到任何提及这种情况的内容,因为它不是您认为的特殊情况
分配一个取消引用的 *this 指针与任何其他指针一样工作。

  • What is more efficient (providing that the first bullet point is true)?
    • In case Foo is movable.
    • In case it's not.

在效率方面没有差异。任何体面的现代 c++ 编译器都会采用复制省略。

关于c++ - 是 *this = Ctor();清除对象状态合法有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57553929/

相关文章:

java - 为什么我不能使用实例变量访问接口(interface)的静态方法

c++ - 使用 boost 读取执行命令的结果(C++ 库)

constructor - 为什么Rebol中的 'context'和 'object'函数不同,但本质上是相同的?

c++ - 聚合类型是否意味着它也是标准布局?

javascript - 为什么构造函数中的 this.prop 返回未定义

object - 在需要构建的对象中设置字段

c++ - 演绎指南可以有一个明确的( bool )说明符吗?

c++ - 套接字发送接收函数

c++ - 使用迭代器从 STL 多重集中删除元素

c++ - 关于变量作用域的 C/C++ 编译器优化