在任何情况下,删除ctor的类都可能有用吗?

时间:2019-07-29 16:01:32

标签: c++ constructor default-constructor

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

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

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

3 个答案:

答案 0 :(得分:6)

  

在任何情况下,删除了ctor的类可能会有用吗?

可以使用类而不创建实例。这种类的最典型示例是类型特征:例如,std::is_samestd::numeric_limits的所有功能都可以使用,而无需创建实例。这样,可以删除其构造函数而不会丢失任何功能。

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

答案 1 :(得分:1)

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

实际上,我的大多数类都没有默认构造函数。他们会选择某些选项或某些初始状态。

即使在这种意义上“无用”的情况下(例如,当您使 no 其他构造函数不可用时),也不需要标准去禁止它,因为这样一来,实现就必须全力以赴以实现禁止,而根本没有收获。就像,如果这意味着类设计没有意义,那是您的错,您可以简单地重写类以使其更适合您的需求。

答案 2 :(得分:0)

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

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