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

如何可以std :: chrono :: duration :: duration()被constexpr?
EN

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

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

constexpr duration() = default;

但是,cppreference.com也对constexpr构造函数这样说:

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

而且,如果我对默认的构造函数感到困惑,cppreference.com似乎认为,带入的默认构造函数的= default定义与隐式默认构造函数不同。

然而,rep(大多数)持续时间的类型是一个纯粹的整数类型。所以,不应该显式的= default默认构造函数duration等同于

constexpr duration() {}

这当然会留下duration::rep 未初始化类型的整数成员变量?而且,事实上,duration这样的默认构造值未初始化的标准行为?(但我找不到明确说明这一点的参考。)

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-25 14:39:34

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

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

另外,它的功能体应该是=删除,或者它应该满足以下要求:

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

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

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

例如:

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,您必须对其进行零初始化。该= default实现允许用零初始化{}

完整的演示:

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{};
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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