默认的构造函数std::chrono::duration
定义如下:
constexpr duration() = default;
但是,cppreference.com也对constexpr
构造函数这样说:
一个constexpr构造函数必须满足以下要求: 必须初始化每个基类和每个非静态成员,无论是在构造函数初始化列表中,还是由成员括号或平等初始值设定项初始化。另外,涉及的每个构造函数都必须是constexpr构造函数,并且每个括号或等号初始值设定项的每个子句都必须是常量表达式
而且,如果我对默认的构造函数感到困惑,cppreference.com似乎认为,带入的默认构造函数的= default
定义与隐式默认构造函数不同。
然而,rep
(大多数)持续时间的类型是一个纯粹的整数类型。所以,不应该显式的= default
默认构造函数duration
等同于
constexpr duration() {}
这当然会留下duration::rep
未初始化类型的整数成员变量?而且,事实上,duration
这样的默认构造值是未初始化的标准行为?(但我找不到明确说明这一点的参考。)
在那么如何才能= default
为构造duration
是constexpr
,如果离开一个非静态成员变量初始化?我错过了什么?
发布于 2018-05-25 14:39:34
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{};
}
https://stackoverflow.com/questions/-100004543
复制相似问题