分配运算符的要求

Requirements for assignment operator

本文关键字:运算符 分配      更新时间:2023-10-16

我的问题很简单,但实际上,我找不到任何关于这方面的信息。复制(移动)分配运算符是否需要构造任务分配对象?

复制构造函数,无论是在语法T object(object_to_copy)中还是T object = object_to_copy构造新对象,因此不需要它已经存在。 这记录在C++标准第 12.8/2 节中。

普通赋值运算符(用于上述复制构造以外的其他上下文)确实要求目标对象已经存在(即必须构造)。 这可以很容易地从标准的第13.5节中推断出来。

我能从你的问题中得到的是,你想问a = b,是否应该完全构建a

在这种情况下,答案是肯定的,a在调用赋值运算符之前应该是一个完全构造的对象。因为赋值只在两个对象之间有意义,而不是在对象和一些随机原始位之间有意义。

与其他

答案相反,我会说可以在构造对象之前调用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=,并且允许编写这样的构造。