# 理念
**理念性规则强调一致性,因此,无法进行检查**
## 1.在代码中直接表达思想
**程序员应该直接用代码表达他们的思想,因为代码可以被编辑器和工具检查**
```cpp
class Data{
//...
public:
Month month() const;//这样做
int month();//不要这样
//...
}
```
+ 第二个成员函数`month()`既没有表示它不修改日期对象,
也没有表示它返回一个月份。
==一个专业的C++开发者应该了解 **STL算法**==
使用它们,可以避免显示使用循环,代码也会易于理解和维护。
>现代C++中有一句谚语:
>如果你显式使用循环的话,说明你不了解 **STL 算法**。
## 2.用ISO标准C++写代码
+ 使用当前的C++标准,不要使用编译器扩展。
+ 要注意未定义行为和实现定义行为。
> 当你必须使用没有写在 **ISO** 标准里的扩展时,可以用一个稳定的接口将它们封装起来。
## 3.表达意图
```cpp
for(const auto& v:vec){...} // (1)
for(auto& v:vec){...} //(2)
std::for_each(std::execution::par,vec,[](auto v){...}); //(3)
```
+ 循环(1)并不会修改容器vec的元素。但是对于循环(2)来说并不成立。
+ 算法`std::for_each(3)`以并行方式(std::execution:par)执行。
这意味着我们并不关心以何种顺序处理元素。
>这个算法使用C++17中的并行算法支持,以并行方式遍历`vec`。这通常用于提高性能,特别是当`vec`非常大,或者循环体中的计算非常复杂时。**然而,因为它是并行的,你不能依赖元素被处理的顺序。**
## 4.理想情况下,程序应该是静态安全的
在编程时,最好能确保所有的变量、对象和函数调用在编译期(Compile-time)就明确它们的类型,以避免在运行期(Run-time)出现类型错误。
+ 在 `C++17`中,可以使用`std::variant`安全地替代联合体。
+ 基于模板的泛型代码减少了转型的需要,因此,也减少了类型错误。
+ 在`C++20`里使用`std::span`可以自动推算出C数组的大小,也可以防止范围错误的发生。
+ 窄化转换是对算术值的有精度损失的隐式转换。
```cpp
int i1(3.14);
int i2 = 3.14;
如果你使用{}初始化语法,编译器就能检测到窄化转换。
int i1{3.14};
int i2 = {3.14};
```