首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std :: chrono :: duration :: duration()如何转换为constexpr?

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

Stack Overflow用户
提问于 2018-05-18 04:26:02
回答 1查看 0关注 0票数 0

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

constexpr duration() = default;

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-18 13:34:17

7.1.5 constexpr说明符[dcl.constexpr]:

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

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

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

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

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

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

例如:

代码语言:javascript
复制
constexpr seconds x1{};

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

代码语言:javascript
复制
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,必须对其进行零初始化

完整的演示:

代码语言:javascript
复制
template <class Rep>
class my_duration
{
    Rep rep_;
public:
    constexpr my_duration() = default;
};


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

有趣的边栏

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

代码语言:javascript
复制
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默认构造函数?

然后我尝试了这个:

代码语言:javascript
复制
using Rep = int;

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


int
main()
{
    constexpr my_duration x{};
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100005269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档