增加遗漏的限定条件,原译文中有'in such a context' (#202)

This commit is contained in:
Chandlerooo 2025-02-14 13:44:04 +08:00 committed by GitHub
parent 3692b1af6e
commit d885587e88
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -30,7 +30,7 @@ std::array<int, arraySize> data; //错误arraySize值在编译期不可知
简而言之,所有`constexpr`对象都是`const`,但不是所有`const`对象都是`constexpr`。如果你想编译器保证一个变量有一个值这个值可以放到那些需要编译期常量compile-time constants的上下文的地方你需要的工具是`constexpr`而不是`const`。
涉及到`constexpr`函数时,`constexpr`对象的使用情况就更有趣了。如果实参是编译期常量,这些函数将产出编译期常量;如果实参是运行时才能知道的值,它们就将产出运行时值。这听起来就像你不知道它们要做什么一样,那么想是错误的,请这么看:
+ `constexpr`函数可以用于需求编译期常量的上下文。如果你传给`constexpr`函数的实参在编译期可知,那么结果将在编译期计算如果实参的值在编译期不知道,你的代码就会被拒绝。
+ `constexpr`函数可以用于需求编译期常量的上下文。在需求编译期常量的上下文中,如果你传给`constexpr`函数的实参在编译期可知,那么结果将在编译期计算如果实参的值在编译期不知道,你的代码就会被拒绝。
+ 当一个`constexpr`函数被一个或者多个编译期不可知值调用时,它就像普通函数一样,运行时计算它的结果。这意味着你不需要两个函数,一个用于编译期计算,一个用于运行时计算。`constexpr`全做了。
假设我们需要一个数据结构来存储一个实验的结果,而这个实验可能以各种方式进行。实验期间风扇转速,温度等等都可能导致亮度值改变,亮度值可以是高,低,或者无。如果有**n**个实验相关的环境条件它们每一个都有三个状态最终可以得到的组合有3<sup>n</sup>个。储存所有实验结果的所有组合需要足够存放3<sup>n</sup>个值的数据结构。假设每个结果都是`int`并且**n**是编译期已知的(或者可以被计算出的),一个`std::array`是一个合理的选择。我们需要一个方法在编译期计算3<sup>n</sup>。C++标准库提供了`std::pow`,它的数学功能正是我们所需要的,但是,对我们来说,这里还有两个问题。第一,`std::pow`是为浮点类型设计的,我们需要整型结果。第二,`std::pow`不是`constexpr`(即,不保证使用编译期可知值调用而得到编译期可知的结果),所以我们不能用它作为`std::array`的大小。