正在数组上调用赋值运算符
Calling assignment operator on an array
我想知道这个代码是如何工作的:
struct my_array
{
int r[1000];
};
int main()
{
my_array foo, bar;
foo = bar;
}
因为foo = bar
调用将调用构造函数为类提供的operator=
,后者将延迟地将其应用于每个成员。但是数组没有operator=
的实现,证明这段代码无法编译:
int main()
{
int a[1000], b[1000];
a = b;
}
那么,我的第一个代码是如何编译的呢?
那么,我的第一个代码是如何编译的呢?
语言规范规定它必须工作,编译器实现这种行为。
默认赋值语义在§12.8[class.copy]的第28条中指定。具体而言,对象的数据成员是逐个赋值的。在数组的情况下,数组的元素是逐个指定的。
为非并集类X执行其子对象。。。
和
--如果子对象是数组,则每个元素都以适合元素类型的方式分配;
(重点矿井)
请注意,在您的特定示例中,第一个代码示例调用未定义的行为,因为bar
的元素在您从这里读取时尚未初始化:
foo = bar; // UB: bar.r uninitialized
您可以通过适当的初始化bar
:来修复此问题
my_array foo;
my_array bar{};
相关文章:
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 为什么初始化时没有调用重载赋值运算符?
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 使用赋值运算符将宏转换为函数调用
- 从赋值运算符调用构造函数
- 赋值运算符重载在通过指针访问时不调用
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- 在其赋值运算符方法中调用对象的析构函数
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 未调用移动赋值运算符
- 初始化对象后,用隐式转换而不是赋值运算符调用构造函数有什么意义
- C++重载赋值运算符在不相关的类中被调用
- 为什么deque::erase()调用赋值运算符
- C++ 不调用赋值运算符
- 正在数组上调用赋值运算符
- 为什么调用赋值运算符会触发销毁函数
- 为C++中具有多个继承派生类的vtables的基之一调用赋值运算符
- 为什么这里不调用赋值运算符?
- 为什么在这种情况下不调用赋值运算符以支持复制构造函数
- 可以 std::set::insert() 调用赋值运算符