C++-Static_assert和constexpr函数在运行时求值的能力

C++ - Static_assert and ability of constexpr functions to evaluate at runtime

本文关键字:运行时 能力 函数 assert constexpr C++-Static      更新时间:2023-10-16

我正在阅读C++中的constexprstatic_assert功能,有一件事似乎让我感到困惑——我读到constexpr函数不一定总是在编译过程中求值,有时它们可以在运行时求值。有一件事让我很困扰,那就是static_assert在编译过程中总是被检查。那个么,若我们将constexpr传递给static_assert,但编译器选择在运行时评估那个constexpr,会发生什么呢?这是个问题吗?

constexpr函数不一定总是在编译期间求值

它总是在编译时进行求值,而此时它应该进行求值,所以当它的返回值用作const表达式时也是如此。

static_assert就是其中之一。CCD_ 9或CCD_。

但在std::cout << f()中不需要在编译时进行计算。

void bar(int p) { const int v = f(p);}中,f不能被评估为constexpr(取决于不是(不可能是)constexpr的函数的参数)。

不,这不是问题。该标准规定,如果它的评估结果为true,则该语句无效(如果评估结果为false,则该程序格式错误)。其结果是,如果在运行时对表达式进行评估,则该表达式可能不会(直接或间接)产生任何(可观察到的)副作用。

允许编译器在运行时计算常量表达式并不能减轻编译器在编译时计算该表达式的负担。这是因为如果不是true,编译器必须提供诊断消息。