为什么 clang 认为我有一个复制构造函数?

问题描述 投票:0回答:2

我有一个具有这些特殊成员函数的结构:

struct MyStruct {
    MyStruct(MyStruct& other) = delete;

    MyStruct(MyStruct&& other) = default;

    explicit MyStruct(int num) noexcept(false);

    explicit MyStruct(MyOtherStructType&& other_type);

    ~MyStruct();

    auto operator=(MyStruct&& other) noexcept(false) -> MyStruct&;
}

叮当整洁 说:

Class 'MyStruct' defines a non-default destructor, a copy constructor, a move
constructor and a move assignment operator but does not define a copy assignment
operator

由于

hicpp-special-member-functions/cppcoreguidelines-special-member-functions
lint,但是我认为我删除了复制构造函数?我错过了什么吗?是不是线错了?

c++ constructor
2个回答
0
投票

所以它说我已经显式删除了复制构造函数,但没有删除复制运算符。这听起来就像有一个复制构造函数。


0
投票

一旦您声明任何特殊成员函数,五法则就适用于所有其他特殊成员函数,而不仅仅是当您为其中一个函数提供自定义定义时。

删除复制构造函数时也应应用该规则的原因是,删除复制构造函数不会阻止复制赋值运算符的隐式声明。

但是,如果您显式删除了复制构造函数,那么您的类型很可能也不应该在赋值时具有默认的复制语义。五法则确保您不会忘记为复制赋值运算符声明正确的语义。

照现在的情况,写

MyStruct x(1);
MyStruct y = x;

格式不正确,但是

MyStruct x(1);
MyStruct y(2);
y = x;

将使用编译器生成的默认复制行为进行编译,如果您删除了复制构造函数,这可能对您的类型是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.