一个有多个默认构造函数的简单类的示例?

4

C++17标准的§13节说:

"一个平凡类是满足以下条件的类:其可以被平凡复制并且具有一个或多个默认构造函数(15.1),其中所有构造函数都是平凡或已删除,至少有一个构造函数不是被删除的。"

我无法想出一个好的例子,以便更好地理解这种措辞。那么“至少有一个构造函数不是被删除的”部分是什么意思呢?一个平凡类的默认构造函数是否可以包含多个“未被删除”的构造函数?如果是,则这些“未被删除”的构造函数必须是平凡的(根据上述措辞)但似乎又不可能。


这个重复问题没有引用标准,但是它问了同样的问题。如果这个问题有所不同,我会撤回重复投票。 - cigien
我认为这个问题不同,因为它特别涉及“平凡类”,而不仅仅是任何类。 - Dan Pat
1个回答

3

示例:

struct Foo
{
    Foo() = default;          // #1  default constructor, trivial, not deleted

    template <class... Args>
    Foo(Args...) = delete;    // #2 default constructor, deleted
};

static_assert(std::is_trivial_v<Foo>);

auto test()
{
     Foo f{}; // OK
}

具有一个或多个默认构造函数

#1和#2都是默认构造函数(参见[class.default.ctor])

其中所有构造函数均为平凡或已删除

#1是平凡的,#2是已删除的

其中至少有一个未被删除

#1未被删除


[class.default.ctor]

X类的默认构造函数是指具有每个非函数参数包含默认实参的X类构造函数(包括没有参数的构造函数的情况)。[...]


不错,我还没有考虑过模板构造函数。这个例子展示了“全部都是平凡或删除”的意义。但是,“至少有一个不被删除”的部分,虽然逻辑上是正确的,但仍然让我感到困扰。如果始终不能有多个平凡构造函数,为什么不声明“默认构造函数之一必须是非删除的”或“构造函数之一必须是平凡的”,以排除不必要的疑问呢? - Dan Pat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接