是否有任何情况下,具有已删除CTOR的课程可能有用

Is there any case where a class with deleted ctor could be useful?

本文关键字:CTOR 程可能 有用 删除 任何 情况下 是否      更新时间:2023-10-16

我想知道为什么标准允许这种声明。

class A
{
public:
    A() : bar(0){}
    A(int foo) : bar(foo){}
private:
    int bar;
};
class B : public A
{
public:
    B() = delete;
};

b不能实例化。

  B b1; //error: use of deleted function ‘B::B()’
  B b2(2); //error: no matching function for call to ‘B::B(int)’

仍然是

class A
{
public:
    A() : bar(0){}
private:
    int bar;
};
class B : public A
{
public:
    B() = delete;
};

给出

B b1; //error: use of deleted function ‘B::B()’

注意:这是不同的,没有默认的ctor:

class G
{
protected:
    int assign;
};
class H : public G
{
public:
    H() = delete;
};

给出

G g1; //works
//H h1; -- error: use of deleted function ‘H::H()’

是否有任何有用的情况?

是否有任何情况下有删除CTOR的课程有用?

可以在不创建实例的情况下使用类。此类类的大多数典型示例是类型特征:例如std::is_samestd::numeric_limits的所有功能,无需创建实例而使用。因此,可以删除其构造函数而不会失去任何功能。

也就是说,通常不需要删除此类类的构造函数,实际上,标准类型特征的隐式续部分未删除。构造函数的删除通常仅用于删除某些构造函数,而不是全部。要明确:仅仅因为某事不是典型的东西,并不意味着它应该是错误。

是的,有很多次没有默认构造函数的类很有用。

实际上,我的大多数课程都没有默认的构造函数。他们采用一些选择或一些初始状态。

即使在这种意义上没有"有用"(例如,当您离开 no 其他构造函数时(,也无需该标准来禁止它,因为那时实施将不得不竭尽全力实施禁令,所以根本没有收益。就像,如果这意味着课堂设计没有意义,那就是您的错,您可以简单地重写班级以更适合您的需求。

似乎这里的问题不是使用已删除的默认构造函数的类是否有用,而是无法构造的类有用有用。

我认为答案是"否"的,但是标准并不预期并禁止所有可能的无用声明案件。