我有一个A
有很多数据成员的类,其中一些是不变的。所有数据成员都有适当的复制构造函数,所以我想默认我的类的复制构造函数:
class A
{
public:
A() : a(1) {}
A(const A& op) = default;
private:
// ... Lots of constant and non-constant member data ...
const int a;
};
然后,我想编写一个构造函数,它接受一个引用A
和一个应该初始化常量数据成员之一的值:
A(const A& op, const int a_);
这里op
应该被复制,并且a
应该在a_
之后初始化或者代替复制。我想通过委托给复制构造函数来避免手动初始化所有数据成员,但是在这种情况下如何覆盖我的 const 数据成员?例如:
// Illegal: constructor delegation can't be mixed with field initialization.
A(const A& op, const int a_) : A(op), a(a_) {}
// Illegal: attempt to assign constant member.
A(const A& op, const int a_) : A(op) { a = a_; }
// Hack. May lead to UB in some cases.
A(const A& op, const int a_) : A(op)
{
*(const_cast<int*>(&a)) = a_;
// ... or same tricks with memcpy ...
}
显然,所有这些方法都是邪恶的,因为它们尝试初始化a
两次。
另一种解决方案是将所有常量数据移动到基类并编写所有需要的ctor,但它看起来很冗长。
有没有更清洁的实施方式A(const A&, int a_)
?