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
的标准行为是未初始化默认构造的值吗? (但我找不到明确指出这一点的引用。)
那么如果= default
的duration
构造函数留下未初始化的非静态成员变量,怎么能成为constexpr
?我想念什么?
最佳答案
7.1.5 constexpr
说明符[dcl.constexpr]说:
简而言之,只要满足上述其他要求,= default
是constexpr
默认构造函数的有效定义。
那么,这对于未初始化的构造如何工作?
没有。
例如:
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.
因此,要创建默认构造的
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{};
}
编译器再次喜欢它。
如果对此还没有CWG问题,那么应该已经存在。行为似乎有点不一致。这可能只是因为我们(整个行业)仍在学习
constexpr
。关于c++ - std::chrono::duration::duration()如何才能成为constexpr?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36342296/