首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果类有引用成员,为什么将合成的复制赋值操作符定义为已删除?

如果类有引用成员,为什么将合成的复制赋值操作符定义为已删除?
EN

Stack Overflow用户
提问于 2018-02-06 04:09:32
回答 1查看 477关注 0票数 1

在C++底稿,第五版,第13.1.6节:

如果成员具有已删除或不可访问的复制赋值操作符,或者类具有const或引用成员,则合成复制赋值操作符被定义为已删除。

本章的解释如下:

虽然我们可以为引用分配一个新的值,但是这样做会改变引用所引用的对象的值。如果为此类类合成了复制赋值操作符,则左侧操作数将继续引用与赋值前相同的对象。它将不像右操作数那样引用同一个对象.由于不太可能需要这种行为,因此如果类有引用成员,则将合成的复制赋值操作符定义为“删除”。

复制类更改引用成员引用的对象。这不是需要的吗?为什么解释说“不太可能被期望”?

具体而言,

代码语言:javascript
复制
class A {
public:
    A(int &n) : a(n) {}
private:
    int &a;
};

int main() {
    int n = 1;

    A a(n);

    /* Why is this allowed? */
    A b(a);

    /*
    Why is this not allowed?
    error C2280: 'A &A::operator =(const A &)': attempting to reference a deleted function
    */
    b = a;

    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-06 04:56:12

一旦创建引用,就不能重新分配它。这意味着如果类包含引用成员,就不可能生成适当的赋值操作符。

复制构造函数是另一回事,因为引用可以在对象创建时分配。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48635366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档