From d885587e883193b3b2c109c2c5c6d1f07d9b0c97 Mon Sep 17 00:00:00 2001 From: Chandlerooo <48609636+Chandlerooo@users.noreply.github.com> Date: Fri, 14 Feb 2025 13:44:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=81=97=E6=BC=8F=E7=9A=84?= =?UTF-8?q?=E9=99=90=E5=AE=9A=E6=9D=A1=E4=BB=B6=EF=BC=8C=E5=8E=9F=E8=AF=91?= =?UTF-8?q?=E6=96=87=E4=B8=AD=E6=9C=89'in=20such=20a=20context'=20(#202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/3.MovingToModernCpp/item15.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3.MovingToModernCpp/item15.md b/src/3.MovingToModernCpp/item15.md index 699b0e0..caf3a47 100644 --- a/src/3.MovingToModernCpp/item15.md +++ b/src/3.MovingToModernCpp/item15.md @@ -30,7 +30,7 @@ std::array data; //错误,arraySize值在编译期不可知 简而言之,所有`constexpr`对象都是`const`,但不是所有`const`对象都是`constexpr`。如果你想编译器保证一个变量有一个值,这个值可以放到那些需要编译期常量(compile-time constants)的上下文的地方,你需要的工具是`constexpr`而不是`const`。 涉及到`constexpr`函数时,`constexpr`对象的使用情况就更有趣了。如果实参是编译期常量,这些函数将产出编译期常量;如果实参是运行时才能知道的值,它们就将产出运行时值。这听起来就像你不知道它们要做什么一样,那么想是错误的,请这么看: -+ `constexpr`函数可以用于需求编译期常量的上下文。如果你传给`constexpr`函数的实参在编译期可知,那么结果将在编译期计算。如果实参的值在编译期不知道,你的代码就会被拒绝。 ++ `constexpr`函数可以用于需求编译期常量的上下文。在需求编译期常量的上下文中,如果你传给`constexpr`函数的实参在编译期可知,那么结果将在编译期计算;如果实参的值在编译期不知道,你的代码就会被拒绝。 + 当一个`constexpr`函数被一个或者多个编译期不可知值调用时,它就像普通函数一样,运行时计算它的结果。这意味着你不需要两个函数,一个用于编译期计算,一个用于运行时计算。`constexpr`全做了。 假设我们需要一个数据结构来存储一个实验的结果,而这个实验可能以各种方式进行。实验期间风扇转速,温度等等都可能导致亮度值改变,亮度值可以是高,低,或者无。如果有**n**个实验相关的环境条件,它们每一个都有三个状态,最终可以得到的组合有3n个。储存所有实验结果的所有组合需要足够存放3n个值的数据结构。假设每个结果都是`int`并且**n**是编译期已知的(或者可以被计算出的),一个`std::array`是一个合理的选择。我们需要一个方法在编译期计算3n。C++标准库提供了`std::pow`,它的数学功能正是我们所需要的,但是,对我们来说,这里还有两个问题。第一,`std::pow`是为浮点类型设计的,我们需要整型结果。第二,`std::pow`不是`constexpr`(即,不保证使用编译期可知值调用而得到编译期可知的结果),所以我们不能用它作为`std::array`的大小。