分配运算符的要求
Requirements for assignment operator
我的问题很简单,但实际上,我找不到任何关于这方面的信息。复制(移动)分配运算符是否需要构造任务分配对象?
复制构造函数,无论是在语法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=
,并且允许编写这样的构造。
相关文章:
- 正在尝试重载二进制搜索树分配运算符
- 自定义先决条件对移动分配运算符有效吗
- 分配给转换运算符失败-C++
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- C++ - 没有自定义交换功能的移动分配运算符?
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 使用 'new[]' 运算符分配内存
- 操作后通过运算符分配对象
- 新运算符分配的大小大于声明的大小.为什么
- 如何控制运算符 [] 分配的值
- 字符** 使用 new 运算符分配内存
- 新的运算符分配函数顺序连续性和初始值
- 如何释放使用 C++ "new" 运算符分配的 C 中的内存
- 只能使用CUDA中的新运算符分配有限的内存
- 使用友元运算符分配和私有变量是不可访问的
- 释放由赋值运算符C++分配的内存
- 确定C++中新运算符分配的内存大小
- 用于新运算符分配的公共内存
- 如何在C++中检索由新运算符分配的对象的地址