提问人:Biear 提问时间:3/3/2023 最后编辑:user12002570Biear 更新时间:3/3/2023 访问量:55
是否可以分配或复制具有 const 成员的类
Can class with const members be assigned or copied
问:
根据 abseil.io/tips/177 的说法,它说
具体来说,如果您的类具有 const 成员,则无法将其分配给(无论是通过复制分配还是移动分配)。该语言可以理解这一点:如果您的类型具有 const 成员,则不会合成 copy-assignment 和 move-assignment 运算符。
我创建了一个简短的片段,我看到对象可以复制/移动。我怎么能理解 abseil.io/tips/177 的那句话?
#include <iostream>
class Stitch {
public:
Stitch(int in):num(in) { std::cout << "c'tor, address:" << this << std::endl; }
~Stitch() { std::cout << "d'tor, address:" << this << std::endl; }
const int num;
const std::size_t kAddr = (int)(this);
};
int main() {
Stitch s1(1);
std::cout << "s1 address: " << &s1 << " " << s1.num << std::endl;
Stitch s2 = s1;
std::cout << "s2 address: " << &s2 << " " << s2.num << std::endl;
Stitch s3 = std::move(s1);
std::cout << "s3 address: " << &s3 << " " << s3.num << std::endl;
Stitch s4 = Stitch(4);
std::cout << "s4 address: " << &s4 << " " << s4.num << std::endl;
}
答:
3赞
user12002570
3/3/2023
#1
我怎么能理解这句话
该语句讨论的是赋值,而不是初始化。它们是不同的东西。具体而言,是副本初始化,而不是副本分配。因此,由于是复制初始化,因此可以使用复制构造函数。Stitch s2 = s1;
Stitch s2 = s1;
这里重要的是,对象在构造过程中不是 const,否则构造函数将无法初始化对象,因为它的所有数据成员都是 const。
另一方面,是复制分配,这就是引用的声明所谈论的。s2 = s1;
评论
0赞
Rishabh Agarwal
9/19/2023
是什么意思:物体在施工过程中不是恒定的?
评论
Stitch s2 = s1;
不是赋值。在 c++ 中,初始化和赋值是不同的东西。例如,是赋值。这句话说的是赋值,而不是初始化。s2 = s1;