- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
std::chrono::duration
的默认构造函数定义如下:
constexpr duration() = default;
(例如,参见 cppreference.com 或 libstdc++ 源代码。)
但是,cppreference.com also says this关于 constexpr
构造函数:
A constexpr constructor must satisfy the following requirements:
...
every base class and every non-static member must be initialized, either in the constructors initialization list or by a member brace-or-equal initializer. In addition, every constructor involved must be a constexpr constructor and every clause of every brace-or-equal initializer must be a constant expression
如果我对默认构造函数感到困惑,cppreference.com seems to say使用 = default
产生的默认构造函数的定义与隐式默认构造函数没有区别。
然而,(大多数)持续时间的 rep
类型是裸整数类型。那么,duration
的显式 = default
默认构造函数不应该等同于
constexpr duration() {}
这当然会使 duration::rep
类型的整数成员变量未初始化?而且,事实上,duration
的标准行为难道不是默认构造的值 未初始化吗? (但我找不到明确说明这一点的引用资料。)
那么,如果 duration
的 = default
构造函数未初始化非静态成员变量,它怎么能成为 constexpr
呢?我错过了什么?
最佳答案
7.1.5 constexpr
说明符 [dcl.constexpr] 说:
The definition of a
constexpr
constructor shall satisfy thefollowing requirements:
- the class shall not have any virtual base classes;
- for a defaulted copy/move constructor, the class shall not have a mutable subobject that is a variant member;
- each of the parameter types shall be a literal type;
- its function-body shall not be a function-try-block;
In addition, either its function-body shall be = delete, or it shallsatisfy the following requirements:
- either its function-body shall be = default, or the compound-statement of its function-body shall satisfy the requirementsfor a function-body of a constexpr function;
- every non-variant non-static data member and base class sub-object shall be initialized (12.6.2);
- if the class is a union having variant members (9.5), exactly one of them shall be initialized;
- if the class is a union-like class, but is not a union, for each of its anonymous union members having variant members, exactly one ofthem shall be initialized;
- for a non-delegating constructor, every constructor selected to initialize non-static data members and base class sub-objects shall bea constexpr constructor;
- for a delegating constructor, the target constructor shall be a constexpr constructor.
简而言之,只要满足上述其他要求,= 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
默认构造函数?!
(更新:现在可以用 C++20 编译)
然后我尝试了这个:
using Rep = int;
class my_duration
{
Rep rep_;
public:
my_duration() = default; // removed constexpr
};
int
main()
{
constexpr my_duration x{};
}
编译器又喜欢它了。
如果在这方面还没有 CWG 问题,那么可能应该有。这种行为似乎有点不一致。这可能只是因为我们(整个行业)仍在学习已在C++20中修复。constexpr
。
关于c++ - std::chrono::duration::duration() 如何成为 constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36342296/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
C++20 计时类型/值之间有什么区别 month{7}和 months{7} ?有两个如此相似的名字是不是很困惑? 最佳答案 是的,同时拥有 month 可能会令人困惑。和 months第一次遇到这
在我的项目中,在我升级到 VS2015 之前,它编译得很好。现在我收到 10 个与 std::chrono::timepoint 有关的错误。这些都是错误:https://gyazo.com/0d3c
在 Linux 上运行(uname 说:) Linux 2.6.32-431.29.2.el6.x86_64 #1 SMP Sun Jul 27 15:55:46 EDT 2014 x86_64 x8
下面的代码不打印epoch。 typedef std::chrono::high_resolution_clock Clock; typedef std::chrono::milliseconds M
我有这个测试代码: #include #include #include namespace chrono = std::chrono; int main() { struct time
我正在使用 jmeter 和 maven 进行性能测试 (REST)。 在我的 pom 中,我有以下插件: chronos-jmeter-maven-plugin:执行我的 jmx 项目 chrono
我有一个 chrono::format::strftime 的静态数组我的应用程序支持的格式。我想避免在运行时解析它们,所以我定义了一个 lazy_static!将它们解析为 chrono::form
我正在尝试编写一个允许用户指定 chrono::duration 的函数,例如 chrono::seconds 并返回 chrono 的结果::duration::count. 我可以使用以下模板函数
考虑以下代码片段: #include #include int main() { auto result1 = std::chrono::duration_cast(std::chron
考虑下面这段代码 #include #include #include int main() { using std::chrono::system_clock; using std
boost::chrono::steady_clock::time_point 之间有什么区别?和 boost::chrono::time_point ,为什么不能相互转换? 这似乎非常多余。 最佳答
我正在尝试在 mingw64 (GCC v11.2) 中构建我的程序。我有以下结构: 在头文件中: struct Timer { std::chrono::time_point start;
有没有什么优雅的方法可以将 boost chrono time_point 转换为标准库中的等价物? 最佳答案 恐怕你不能保证转换,除非你先验地接受 boost::chrono::steady_clo
以下程序: #include #include #include inline uint64_t now() { return std::chrono::duration_cast
我有一个变量存储为 long 来自 std::chrono::system_clock::time_point.time_since_epoch().count() 的值。我现在想从 long 变量中
extern crate chrono; use chrono::{DateTime, Utc}; use std::time::Duration; pub fn after(start: DateT
我想在几秒钟内使用 chrono 库找出 2 个时钟之间的差异。我尝试了多种方法,以下是其中之一。所有这些都工作正常,直到差异为 59 秒,但之后超时。我真的需要差异的实际值,即使它超过 59 秒 #
我试图计算执行插入排序函数期间耗时。所以我做了如下。附言- 函数运行正常并对所有数字进行排序。编译器-GCC window auto start = chrono::steady_clock:
我有一个年 (int)、月 (int) 和日 (int) 形式的日期,例如,2018、10、12 表示 2018 年 10 月 12 日。 有没有一种方法可以使用带有这些整数的 C++ Chrono
我是一名优秀的程序员,十分优秀!