C++ Constexpr默认函数

C++ Constexpr默认函数,c++,c++17,language-lawyer,C++,C++17,Language Lawyer,可以隐式使用constexpr的默认函数是constexpr吗 class c { public: constexpr /*<- necessary?*/ c() = default; constexpr /*<- necessary?*/ c(c const&) = default; constexpr /*<- necessary?*/ c(c &&) = default; constexpr /*<- nece

可以隐式使用constexpr的默认函数是constexpr吗

class c
{
public:
    constexpr /*<- necessary?*/ c() = default;
    constexpr /*<- necessary?*/ c(c const&) = default;
    constexpr /*<- necessary?*/ c(c &&) = default;
    constexpr /*<- necessary?*/ c& operator =(c const&) = default;
    constexpr /*<- necessary?*/ c& operator =(c &&) = default;
    ~c() = default;

private:
    int x = 0;
};
c类
{
公众:

constexpr/*是,如果默认特殊成员满足constexpr成员的要求,则默认特殊成员为
constexpr
。特别是,有关默认构造函数,请参见11.4.4.1/4:

默认且未定义为已删除的默认构造函数是隐式定义的…隐式定义的默认构造函数执行类的初始化集,该初始化集将由用户编写的默认构造函数为该类执行,而该类没有构造函数初始值设定项和空复合语句…如果该用户编写了de故障构造函数将满足constexpr构造函数([dcl.constexpr])的要求,隐式定义的默认构造函数是constexpr。在隐式定义类的默认构造函数之前,隐式定义其基类及其非静态数据成员的所有非用户提供的默认构造函数


其他特殊成员也有类似的措辞。

是的,如果默认特殊成员满足constexpr成员的要求,则默认特殊成员为
constexpr
。特别是,有关默认构造函数,请参见11.4.4.1/4:

默认且未定义为已删除的默认构造函数是隐式定义的…隐式定义的默认构造函数执行类的初始化集,该初始化集将由用户编写的默认构造函数为该类执行,而该类没有构造函数初始值设定项和空复合语句…如果该用户编写了de故障构造函数将满足constexpr构造函数([dcl.constexpr])的要求,隐式定义的默认构造函数是constexpr。在隐式定义类的默认构造函数之前,隐式定义其基类及其非静态数据成员的所有非用户提供的默认构造函数


其他特殊成员也有类似的措辞。

因此没有必要使用
constexpr
noexcept
等来限定默认函数?我在回答中只讨论了constexpr,但是的,noexcept也是自动的,请参见14.5。因此,没有必要使用
constexpr
来限定默认函数noexcept
等等?我在回答中只提到了constexpr,但是是的,noexcept也是自动的,请参见14.5。