std :: chrono :: duration :: duration()如何转换为constexpr?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (30)

默认的构造函数std::chrono::duration定义如下:

constexpr duration() = default;

但是,cppreference.comconstexpr构造函数这样说

一个constexpr构造函数必须满足以下要求: ... 必须初始化每个基类和每个非静态成员,无论是在构造函数初始化列表中,还是由成员括号或平等初始值设定项初始化。另外,涉及的每个构造函数都必须是constexpr构造函数,并且每个括号或等号初始值设定项的每个子句都必须是常量表达式

而且,如果我对默认的构造函数感到困惑。

那么如果离开一个非静态成员变量初始化?如何才能使得 default构造函数成为constexpr,我错过了什么?

提问于
用户回答回答于

7.1.5 constexpr说明符[dcl.constexpr]:

constexpr构造函数的定义应满足以下要求:

  • 该类不应该有任何虚拟基类;
  • 对于默认的复制/移动构造函数,类不应该具有变体成员的可变子对象;
  • 每个参数类型应该是一个文字类型;
  • 它的功能体不应该是一个功能尝试块;

另外,它应该满足以下要求:

  • 它的函数体应该是default,或者它的函数体的复合语句应该满足constexpr函数的函数体的要求;
  • 每个非变量非静态数据成员和基类子对象都应该初始化(12.6.2);
  • 如果类是具有变体成员的工会(9.5),则其中的一个应该初始化。
  • 对于非委托构造函数,选择初始化非静态数据成员和基类子对象的每个构造函数都应该是一个constexpr构造函数;
  • 对于委托构造函数,目标构造函数应该是constexpr构造函数。

简而言之,只要符合上述其他要求,就是默认构造函数constexpr= default的有效定义。

那么这对未初始化的结构是如何工作的呢?

例如:

constexpr seconds x1{};

以上工作并初始化x10s。然而:

constexpr seconds x2;

error: default initialization of an object of const type 'const seconds'
       (aka 'const duration<long long>') without a user-provided default
        constructor
    constexpr seconds x2;
                      ^
                        {}
1 error generated.

因此,要创建constexpr默认构造duration,必须对其进行零初始化

完整的演示:

template <class Rep>
class my_duration
{
    Rep rep_;
public:
    constexpr my_duration() = default;
};


int
main()
{
    constexpr my_duration<int> x{};
}

有趣的边栏

我一直想知道为什么以下不起作用:

using Rep = int;

class my_duration
{
    Rep rep_;
public:
    constexpr my_duration() = default;
};


int
main()
{
    constexpr my_duration x{};
}

error: defaulted definition of default constructor is not constexpr
        constexpr my_duration() = default;
        ^

为什么使这个类成为非模板会破坏constexpr默认构造函数?

然后我尝试了这个:

using Rep = int;

class my_duration
{
    Rep rep_;
public:
    my_duration() = default;  // removed constexpr
};


int
main()
{
    constexpr my_duration x{};
}

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问5 回答
  • 无聊至极

    4 粉丝504 提问5 回答
  • 嗨喽你好

    7 粉丝480 提问4 回答
  • Richel

    8 粉丝0 提问3 回答

扫码关注云+社区

领取腾讯云代金券