为什么 constexpr 在编译期间不能保证 运行?
Why isn't constexpr guaranteed to run during compilation?
为什么 constexpr 在编译期间不能保证 运行?
此外,为什么添加 consteval
而不是更改 constexpr
来保证编译时执行?
constexpr
在变量上使用时已经保证 compile-time 评估。
如果在函数上使用它不应该强制执行 compile-time 评估,因为您希望大多数函数在 compile-time 和运行时都可用。
consteval
允许强制函数在运行时不可用。但这并不是所有常见的要求。
该语言有特定的语言限制,要求某些表达式是 compile-time 常量表达式。模板参数、数组大小和其他一些位置特别需要一个 compile-time 常量值。因此,如果您将 constexpr
应用于一个变量,那么您这样做的明确意图是在其中一个地方使用该变量。所以语言要求它是常量表达式。
函数不是这样。在 C++ 中(目前在 C++ 中)很少有函数可以在编译时使用的语言结构,这些结构在 运行 时也不可用于已编译的可执行文件。也就是说,一个函数在编译时可以做的事情并不多在运行时也不能。
如果所有 compile-time 函数都可以在 运行 时间值下正常执行,那么没有理由要求 运行 在 compile-time 必须 运行 在 compile-time.
consteval
被添加到语言中,用于只有编译器具有特定信息的情况的特定目的。目前,正好 一个标准库函数是consteval
:std::source_location::current
。这是因为被查询的信息(函数调用在源代码中的位置)只对编译器可用。
为什么 constexpr 在编译期间不能保证 运行?
此外,为什么添加 consteval
而不是更改 constexpr
来保证编译时执行?
constexpr
在变量上使用时已经保证 compile-time 评估。
如果在函数上使用它不应该强制执行 compile-time 评估,因为您希望大多数函数在 compile-time 和运行时都可用。
consteval
允许强制函数在运行时不可用。但这并不是所有常见的要求。
该语言有特定的语言限制,要求某些表达式是 compile-time 常量表达式。模板参数、数组大小和其他一些位置特别需要一个 compile-time 常量值。因此,如果您将 constexpr
应用于一个变量,那么您这样做的明确意图是在其中一个地方使用该变量。所以语言要求它是常量表达式。
函数不是这样。在 C++ 中(目前在 C++ 中)很少有函数可以在编译时使用的语言结构,这些结构在 运行 时也不可用于已编译的可执行文件。也就是说,一个函数在编译时可以做的事情并不多在运行时也不能。
如果所有 compile-time 函数都可以在 运行 时间值下正常执行,那么没有理由要求 运行 在 compile-time 必须 运行 在 compile-time.
consteval
被添加到语言中,用于只有编译器具有特定信息的情况的特定目的。目前,正好 一个标准库函数是consteval
:std::source_location::current
。这是因为被查询的信息(函数调用在源代码中的位置)只对编译器可用。