C++ - Static_assert 和 constexpr 函数在运行时求值的能力
C++ - Static_assert and ability of constexpr functions to evaluate at runtime
我正在阅读 C++ 中的 constexpr
和 static_assert
功能,有一件事让我感到困惑 - 我读到 constexpr
函数不一定总是在编译期间求值他们有时可以在运行时进行评估。困扰我的一件事是 static_assert
在编译期间总是被检查。那么,如果我们将 constexpr
传递给 static_assert
,但编译器选择在运行时评估 constexpr
,会发生什么?这甚至是个问题吗?
不,这不是问题。该标准表示,如果它的计算结果为真,则该语句无效(如果它的计算结果为假,则程序格式错误)。这样做的结果是,如果在运行时评估表达式可能没有任何(可观察到的)副作用(直接或间接)。
无论如何,允许编译器在运行时计算常量表达式并不能减轻编译器在编译时计算该表达式的负担。这是因为如果不是 true
.
,编译器必须提供诊断消息
constexpr functions are not necessarily always evaluated during compilation
它总是在应该的时候在编译时求值,所以当它的 return 值被用作 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
的函数参数)。
我正在阅读 C++ 中的 constexpr
和 static_assert
功能,有一件事让我感到困惑 - 我读到 constexpr
函数不一定总是在编译期间求值他们有时可以在运行时进行评估。困扰我的一件事是 static_assert
在编译期间总是被检查。那么,如果我们将 constexpr
传递给 static_assert
,但编译器选择在运行时评估 constexpr
,会发生什么?这甚至是个问题吗?
不,这不是问题。该标准表示,如果它的计算结果为真,则该语句无效(如果它的计算结果为假,则程序格式错误)。这样做的结果是,如果在运行时评估表达式可能没有任何(可观察到的)副作用(直接或间接)。
无论如何,允许编译器在运行时计算常量表达式并不能减轻编译器在编译时计算该表达式的负担。这是因为如果不是 true
.
constexpr functions are not necessarily always evaluated during compilation
它总是在应该的时候在编译时求值,所以当它的 return 值被用作 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
的函数参数)。