mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-24 08:10:19 +08:00
item15: update
This commit is contained in:
parent
b8c5761e28
commit
bc96c294ff
@ -32,3 +32,22 @@ std::array<int, arraySize2> data2; // 没问题, arraySize2是constexpr
|
||||
+ **constexpr**函数可以用于需求编译期常量的上下文。如果你传给**constexpr**函数的实参在编译期可知,那么结果将在编译期计算。如果实参的值在编译期不知道,你的代码就会被拒绝。
|
||||
+ 当一个**constexpr**函数被一个或者多个编译期不可知值调用时,它就像普通函数一样,运行时计算它的结果。这意味着你不需要两个函数,一个用于编译期计算,一个用于运行时计算。**constexpr**全做了。
|
||||
|
||||
假设我们需要一个数据结构来存储一个实验的结果,而这个实验可能以各种方式进行。实验期间风扇转速,温度等等都可能导致亮度值改变,亮度值可以是高,低,或者无。如果有n个实验相关的环境条件。它们每一个都有三个状态,最终可以得到的组合有`3^n`个。储存所有实验结果的所有组合需要这个数据结构足够大。假设每个结果都是**int**并且**n**是编译期已知的(或者可以被计算出的),一个`std::array`是一个合理的选择。我们需要一个方法在编译期计算`3^n`。C++标准库提供了`std::pow`,它的数学意义正是我们所需要的,但是,对我们来说,这里还有两个问题。第一,`std::pow`是为浮点类型设计的 我们需要整型结果。第二,`std::pow`不是**constexpr**(即,使用编译期可知值调用得到的可能不是编译期可知的结果),所以我们不能用它作为`std::array`的大小。
|
||||
|
||||
幸运的是,我们可以应需写个`pow`。我将展示怎么快速完成它,不过现在让我们先看看它应该怎么被声明和使用:
|
||||
```cpp
|
||||
constexpr // pow是constexpr函数
|
||||
int pow(int base, int exp) noexcept // 绝不抛异常
|
||||
{
|
||||
… // 实现在这里
|
||||
}
|
||||
constexpr auto numConds = 5; //条件个数
|
||||
std::array<int, pow(3, numConds)> results; // 结果有3^numConds个元素
|
||||
```
|
||||
回忆下`pow`前面的**constexpr**没有告诉我们`pow`返回一个**const**值,它只说了如果**base**和**exp**是编译期常量,`pow`返回值可能是编译期常量。如果**base** 和/或 **exp**不是编译期常量,`pow`结果将会在运行时计算。这意味着**pow**不知可以用于像`std::array`的大小这种需要编译期常量的地方,它也可以用于运行时环境:
|
||||
```cpp
|
||||
auto base = readFromDB("base"); // 运行时获取三个值
|
||||
auto exp = readFromDB("exponent");
|
||||
auto baseToExp = pow(base, exp); // 运行时调用pow
|
||||
```
|
||||
因为**constexpr**函数必须能在编译期值调用的时候返回编译器结果,就必须对它的实现施加一些限制
|
@ -26,7 +26,7 @@
|
||||
7. [Item 13:优先考虑const_iterator而非iterator](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item13.md)
|
||||
8. [Item 14:如果函数不抛出异常请使用noexcept](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item14.md)
|
||||
9. [Item 15:尽可能的使用constexpr](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item15.md) _updating_
|
||||
10. Item 16:确保const成员函数线程安全
|
||||
10. [Item 16:让const成员函数线程安全](https://github.com/racaljk/EffectiveModernCppChinese/blob/master/3.MovingToModernCpp/item16.md) __contribute by @windski__
|
||||
11. Item 17:理解特殊成员函数函数的生成
|
||||
4. 智能指针
|
||||
1. Item 18:对于占有性资源使用std::unique_ptr
|
||||
|
Loading…
Reference in New Issue
Block a user