Chr*_*ris 1 c++ constexpr c++11
我想引入在编译时进行错误检查的强类型。对于我的 chrono 类型,我注意到当基础类型从 变为 时,文字会默默地缩小int64_t,int32_t从而导致溢出。所以我引入了显式检查。
delay_t {10s}然而,即使对于常量参数(例如无法表示的 ),在编译时也不会检查此检查。
#include <chrono>
#include <cstdint>
#include <stdexcept>
struct delay_t {
std::chrono::duration<int32_t, std::nano> value {};
constexpr explicit delay_t(std::chrono::duration<int64_t, std::nano> delay)
: value {delay}
{
if (value != delay) {
throw std::runtime_error("delay cannot be represented.");
}
};
};
auto foo(delay_t delay) -> void {}
auto main() -> int {
using namespace std::chrono_literals;
foo(delay_t {10s}); // here I want a compile time error,
// but I get a runtime error.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会编译并导致运行时错误。我验证了文字operator"" s是 a并且它可以在构造函数中constexpr使用。我还想使用带有运行时值的类型,所以这不是一个选项。constevaldelay_t
time_t {10s}我如何告诉上面的编译器像在编译时一样评估常量文字?我正在使用 C++20。
constexpr仅在编译时在常量表达式中求值,而不取决于参数。
您可以将表达式拆分为
constexpr delay_t delay{10s}; // Compile time evaluated, so error at compile time
foo(delay);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |