是 *this = Ctor();清除对象状态合法有效?
Is *this = Ctor(); legal and efficient for clearing an object's state?
我偶然发现了这段重新建立 class 不变量的代码:
class Foo {
// some stuff in here
public:
void clear() {
*this = Foo();
//operator=(Foo()); // commented out in favor of the line above
}
};
- 我假设对
operator=
的调用是合法的并且按预期工作,但会创建一个不必要的临时文件,以防 class 不可移动.因此,手动分配默认值可能会更有效,如果我们想扩展 class. ,这很麻烦且容易出错
*this = Foo()
,如果允许的话,可能更有效,因为我假设复制省略可以在这里工作(不管 class 是可移动的)。
所以我的问题是:
- 声明
*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++ 编译器都会采用复制省略。
我偶然发现了这段重新建立 class 不变量的代码:
class Foo {
// some stuff in here
public:
void clear() {
*this = Foo();
//operator=(Foo()); // commented out in favor of the line above
}
};
- 我假设对
operator=
的调用是合法的并且按预期工作,但会创建一个不必要的临时文件,以防 class 不可移动.因此,手动分配默认值可能会更有效,如果我们想扩展 class. ,这很麻烦且容易出错
*this = Foo()
,如果允许的话,可能更有效,因为我假设复制省略可以在这里工作(不管 class 是可移动的)。
所以我的问题是:
- 声明
*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++ 编译器都会采用复制省略。