赋值运算符的要求

时间:2014-11-30 16:55:51

标签: c++

我的问题很简单,但实际上,我找不到任何有关此问题的信息。复制(移动)分配操作员是否需要构建受让人?

3 个答案:

答案 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=,并允许一个构造这样的构造。