我的问题很简单,但实际上,我找不到任何有关此问题的信息。复制(移动)分配操作员是否需要构建受让人?
答案 0 :(得分:1)
copy constructor,无论是语法T object(object_to_copy)
还是T object = object_to_copy
构造新对象,因此不要求它已经存在。这在C ++标准的第12.8 / 2节中有记录。
普通赋值运算符在上面的复制构造之外的其他上下文中使用,确实需要目标对象已经存在(即必须构造)。这很容易从标准的第13.5节中推断出来。
答案 1 :(得分:0)
我可以从您的问题中得到的问题是,您想问a = b
是否应a
完全构建。
在这种情况下,答案是肯定的,a
应该是在调用赋值运算符之前完全构造的对象。因为赋值仅在两个对象之间有意义,而不是在对象和一些随机原始位之间。
答案 2 :(得分:0)
与其他答案相反,我会说在构造对象之前可以调用operator=
。我相信以下代码是有效的,并不会引发未定义的行为。
#include <iostream>
class A
{
public:
A(){
std::cout << "A()\n";
*this = *this;
}
A(const A& a) { std::cout << "A(const A& a)\n"; }
A& operator=(const A& a) { std::cout << "operator=\n"; return *this; }
};
int main()
{
A a;
return 0;
}
输出:
A()
operator=
当然,它没有任何意义。然而,问题是是否允许某些事情,我的答案是肯定的。显然,在构造函数结束之前调用operator=
,并允许一个构造这样的构造。