是否可以分配或复制具有 const 成员的类

Can class with const members be assigned or copied

提问人:Biear 提问时间:3/3/2023 最后编辑:user12002570Biear 更新时间:3/3/2023 访问量:55

问:

根据 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;
}

C++ 复制构造函数 成员 move-constructor

评论

1赞 user12002570 3/3/2023
Stitch s2 = s1;不是赋值。在 c++ 中,初始化和赋值是不同的东西。例如,是赋值。这句话说的是赋值,而不是初始化。s2 = s1;
1赞 user12002570 3/3/2023
该对象在构造过程中不是 const,并且该语句谈论赋值而不是初始化。

答:

3赞 user12002570 3/3/2023 #1

我怎么能理解这句话

该语句讨论的是赋值,而不是初始化。它们是不同的东西。具体而言,是副本初始化,而不是副本分配。因此,由于是复制初始化,因此可以使用复制构造函数Stitch s2 = s1;Stitch s2 = s1;

这里重要的是,对象在构造过程中不是 const,否则构造函数将无法初始化对象,因为它的所有数据成员都是 const。

另一方面,是复制分配,这就是引用的声明所谈论的。s2 = s1;

评论

0赞 Rishabh Agarwal 9/19/2023
是什么意思:物体在施工过程中不是恒定的?