在任何情况下,带有已删除 ctor 的 class 可能有用吗?

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

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

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()’

注意:这与没有默认构造函数不同:

class G
{
protected:
    int assign;
};

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

给予

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

这在任何情况下都有用吗?

是的,很多时候 class 没有默认构造函数是有用的。

事实上,我的大多数 classes 都没有默认构造函数。相反,他们采用一些选项或一些初始状态。

即使在那个意义上它不是 "useful"(比如当你离开 没有 其他可用的构造函数时),也不需要标准去特意禁止它,因为那样的话,实施将不得不特意实施禁令,而这根本没有任何好处。比如,如果这意味着 class 设计没有意义,那是你的错,你可以简单地重写 class 以更适合你的需要。

看来这里的问题不是删除默认构造函数的类是否有用,而是不能构造的类是否有用有用。

我认为答案是"no",但标准并未预见并禁止所有可能的无用声明情况。

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

类 可以在不创建实例的情况下使用。这种 类 的最典型示例是类型特征:例如 std::is_samestd::numeric_limits 的所有特征都可以在不创建实例的情况下使用。因此,可以删除它们的构造函数而不会丢失任何功能。

也就是说,通常没有必要删除此类 类 的构造函数,事实上,标准类型特征的隐式构造函数不会被删除。构造函数的删除通常用于仅删除某些构造函数,而不是所有构造函数。需要明确的是:仅仅因为某些东西不典型,并不意味着它应该是一个错误。