'类型非静态const成员不能使用默认赋值运算符' - 这是什么意思?

Arm*_*ada 5 c++ const

此类标记以下错误:'非静态const成员'const int成员:: membershipNo',不能使用默认赋值运算符'.奇怪的是这个代码在另一个项目中重复并完美运行.你能帮我把它搞定吗?

Member.h

class Member : public Person
    {
    public:
        Member();
        Member(int membershipNo);
        virtual ~Member();

        int getMembershipNo() const;

    private:
        const int membershipNo;

        friend class boost::serialization::access;
        template<class Archive>
        void serialize(Archive& ar, const unsigned int version)
        {
            ar & boost::serialization::base_object<Person>(*this);
            ar & membershipNo;
        }

    };
Run Code Online (Sandbox Code Playgroud)

Member.cpp

Member::Member() : membershipNo(0)
{
    Person();
}

Member::Member(int memberNo) : membershipNo(memberNo)
{
    Person();
}

Member::~Member()
{
    // TODO Auto-generated destructor stub
}

int Member::getMembershipNo() const
{
    return membershipNo;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 7

据推测,在您的代码中的某个位置,您将分配给a Member,类似这样的内容:

Member m1, m2;
m1 = m2;
Run Code Online (Sandbox Code Playgroud)

或者您在需要可分配类型的上下文中使用它.

由于您没有提供自己的赋值运算符重载Member,因此隐式定义的默认赋值运算符通常会启动.但是,由于您有const数据成员,编译器不会为您隐式定义一个.你需要自己提供.

这是有道理的,因为想象中的代码示例我只是给在,什么都要编译器做m1membershipNo成员?如果其分配m2membershipNo呢?它是如何能做到这一点,如果membershipNoconst?在这种情况下,编译器只是说"不,我不能这样做".

X如果X具有以下内容,则将类的默认复制/移动赋值运算符定义为已删除:

  • const类型(或其数组)的非静态数据成员
  • [...]

正如我所说,为了能够使用a进行赋值Member,您需要提供自己的赋值运算符:

Member& Member::operator=(const Member& other)
{
  // Copy things from other to this
}
Run Code Online (Sandbox Code Playgroud)

然而,这里存在const成员的问题.如果您按照描述提供自己的复制赋值操作符,并且复制membershipNo,那么您是否真的复制了另一个对象?从逻辑上讲,有意义的是,任何const状态的对象都不应该被分配.

然而,使用复制构造函数是完全正确的 - 您只需要确保membershipNo在成员初始化列表中初始化:

Member::Member(const Member& other)
  : membershipNo(other.membershipNo)
{
  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

Member m1;
Member m2 = m1;
Run Code Online (Sandbox Code Playgroud)