[英]c++ static_assert fails on both branches of an 'if constexpr statement'
[英]C++ - Static_assert and ability of constexpr functions to evaluate at runtime
我正在阅读有关C ++中的constexpr
和static_assert
功能的信息,这似乎使我感到困惑-我读到constexpr
函数并不一定总是在编译过程中进行评估,它们有时可以在运行时进行评估。 让我困扰的一件事是,在编译过程中始终会检查static_assert
。 那么,如果我们将constexpr
传递给static_assert
,但是编译器选择在运行时评估该constexpr
发生什么呢? 这甚至是一个问题吗?
constexpr函数不一定在编译过程中总是求值
它总是在应该编译时进行评估,因此将其返回值用作const表达式时。
static_assert
是这种情况之一。 constexpr int value = f();
或C<f()> c;
(模板参数)是其他情况。
但是在std::cout << f()
,不需要在编译时进行计算。
并且在void bar(int p) { const int v = f(p);}
, f
不能被评估为constexpr
(取决于不是(不能是) constexpr
的函数参数)。
不,那不是问题。 该标准说,如果评估结果为true,则该语句无效(如果评估结果为false,则程序格式错误)。 这样的结果是,如果在运行时对表达式进行计算(直接或间接)可能没有任何(可观察到的)副作用。
无论如何,允许编译器在运行时评估常量表达式并不能减轻编译器在编译时评估该表达式的负担。 这是因为如果不是true
则编译器必须提供诊断消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.