std::chrono::duration的默认构造函数定义如下:
constexpr duration() = default;
(例如,请参阅cppreference.com或libstdc++源。)

但是,cppreference.com also says this关于constexpr构造函数:



如果我对默认构造函数感到困惑,则cppreference.com seems to say= default一起出现的默认构造函数与隐式默认构造函数的定义没有不同。

但是,(大多数)持续时间的rep类型是裸整数类型。因此,不应将= default的显式duration默认构造函数等同于
constexpr duration() {}
哪个当然会使duration::rep类型的整数成员变量未初始化?而且,实际上,不是duration的标准行为是未初始化默认构造的值吗? (但我找不到明确指出这一点的引用。)

那么如果= defaultduration构造函数留下未初始化的非静态成员变量,怎么能成为constexpr?我想念什么?

最佳答案

7.1.5 constexpr说明符[dcl.constexpr]说:



简而言之,只要满足上述其他要求,= defaultconstexpr默认构造函数的有效定义。

那么,这对于未初始化的构造如何工作?

没有。

例如:

constexpr seconds x1{};

上面的工作并将x1初始化为0s。然而:
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.

因此,要创建默认构造的constexprduration,您必须对其进行零初始化。并且= 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{};
}

编译器再次喜欢它。

如果对此还没有CWG问题,那么应该已经存在。行为似乎有点不一致。这可能只是因为我们(整个行业)仍在学习constexpr

关于c++ - std::chrono::duration::duration()如何才能成为constexpr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36342296/

10-11 22:51
查看更多