Constexpr 构造函数在编译时不求值

Chr*_*ris 1 c++ constexpr c++11

我想引入在编译时进行错误检查的强类型。对于我的 chrono 类型,我注意到当基础类型从 变为 时,文字会默默地缩小int64_tint32_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。

Jar*_*d42 5

constexpr仅在编译时在常量表达式中求值,而不取决于参数。

您可以将表达式拆分为

constexpr delay_t delay{10s}; // Compile time evaluated, so error at compile time
foo(delay);
Run Code Online (Sandbox Code Playgroud)