我想知道为什么标准允许这种声明。
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()’
在任何情况下这都有用吗?
答案 0 :(得分:6)
在任何情况下,删除了ctor的类可能会有用吗?
可以使用类而不创建实例。这种类的最典型示例是类型特征:例如,std::is_same
和std::numeric_limits
的所有功能都可以使用,而无需创建实例。这样,可以删除其构造函数而不会丢失任何功能。
也就是说,通常不必删除此类的构造函数,并且实际上不会删除标准类型特征的隐式构造函数。删除构造函数通常仅用于删除某些构造函数,而不是全部删除。需要说明的是:仅仅因为有些不典型,并不意味着它应该是一个错误。
答案 1 :(得分:1)
是的,很多时候没有默认构造函数的类很有用。
实际上,我的大多数类都没有默认构造函数。他们会选择某些选项或某些初始状态。
即使在这种意义上“无用”的情况下(例如,当您使 no 其他构造函数不可用时),也不需要标准去禁止它,因为这样一来,实现就必须全力以赴以实现禁止,而根本没有收获。就像,如果这意味着类设计没有意义,那是您的错,您可以简单地重写类以使其更适合您的需求。
答案 2 :(得分:0)
这里的问题似乎不是删除默认构造函数的类是否有用,而是不能构造的类是否有用。
我认为答案是“否”,但是该标准并未预见并禁止所有可能的无用声明情况。