默认的构造函数std::chrono::duration
定义如下:
constexpr duration() = default;
但是,cppreference.com对constexpr
构造函数这样说:
一个constexpr构造函数必须满足以下要求: ... 必须初始化每个基类和每个非静态成员,无论是在构造函数初始化列表中,还是由成员括号或平等初始值设定项初始化。另外,涉及的每个构造函数都必须是constexpr构造函数,并且每个括号或等号初始值设定项的每个子句都必须是常量表达式
而且,如果我对默认的构造函数感到困惑。
那么如果离开一个非静态成员变量初始化?如何才能使得 default
构造函数成为constexpr
,我错过了什么?
发布于 2018-05-18 13:34:17
7.1.5 constexpr
说明符[dcl.constexpr]:
constexpr
构造函数的定义应满足以下要求:
另外,它应该满足以下要求:
简而言之,只要符合上述其他要求,就是默认构造函数constexpr= default
的有效定义。
那么这对未初始化的结构是如何工作的呢?
例如:
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
,必须对其进行零初始化。
完整的演示:
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{};
}
https://stackoverflow.com/questions/-100005269
复制相似问题