为什么 constexpr 不能保证在编译期间运行?

问题描述 投票:0回答:2

为什么 constexpr 不能保证在编译期间运行?

此外,为什么添加

consteval
而不是更改
constexpr
来保证编译时执行?

c++ constexpr consteval
2个回答
1
投票

constexpr
在变量上使用时已经保证了编译时评估。

如果在函数上使用,则不应强制执行编译时评估,因为您希望大多数函数在编译时和运行时都可用。

consteval
允许强制函数在运行时不可用。但这并不是常见的要求。


这里是一个修改后的答案,因为从技术上讲,

constexpr
consteval
是关于某些评估是否是常量表达式或必须是常量表达式。这并不意味着编译器必须在编译时计算这些表达式(因为不可能有任何可观察到的差异),但这就是意图

constexpr
已经保证了在变量上使用时初始化的完整表达式是常量表达式。

如果在函数上使用,则不应在调用站点强制执行常量表达式的求值,因为您希望大多数函数在常量表达式内部和外部都可用。

consteval
允许强制函数只能作为常量表达式调用。但这并不是常见的要求。


1
投票

该语言具有特定的语言限制,要求某些表达式是编译时常量表达式。模板参数、数组大小和其他一些位置特别需要编译时常量值。因此,如果您将

constexpr
应用于变量,则您这样做的明确意图是在这些位置之一使用该变量。所以语言要求它是一个常量表达式。

函数的情况并非如此。 (目前在 C++ 中)C++ 中函数可以在编译时使用的语言结构很少,但在运行时编译的可执行文件也无法使用这些语言结构。也就是说,函数在编译时可以做的事情在运行时也无法做

如果所有编译时函数都可以在运行时值下正常执行,那么就没有理由要求可以在编译时运行的函数必须在编译时运行。

consteval
被添加到语言中是为了仅编译器拥有某些信息的情况的特定目的。就目前情况而言,确切地有一个标准库函数是
consteval
std::source_location::current
。这是因为正在查询的信息(函数调用的源代码中的位置)仅可供编译器使用。

© www.soinside.com 2019 - 2024. All rights reserved.