@@ -121,7 +121,7 @@ int main() {
121121
122122> 注意,现在大部分编译器其实都带有自身编译优化,很多非法行为在编译器优化的加持下会变得合法,若需重现编译报错的现象需要使用老版本的编译器。
123123
124- C++11 提供了 `constexpr` 让用户显式的声明函数或对象构造函数在编译器会成为常量表达式 ,这个关键字明确的告诉编译器应该去验证 `len_foo` 在编译期就应该是一个常量表达式。
124+ C++11 提供了 `constexpr` 让用户显式的声明函数或对象构造函数在编译期会成为常量表达式 ,这个关键字明确的告诉编译器应该去验证 `len_foo` 在编译期就应该是一个常量表达式。
125125
126126此外,`constexpr` 的函数可以使用递归:
127127
@@ -612,8 +612,6 @@ int main() {
612612}
613613```
614614
615- > 直至往后的内容正在更新,尽请期待
616-
617615### 默认模板参数
618616
619617我们可能定义了一个加法函数:
@@ -638,7 +636,7 @@ auto add(T x, U y) -> decltype(x+y) {
638636
639637### 变长参数模板
640638
641- 模板一直是 C++ 所独有的**黑魔法**(一起念:**Dark Magic**)之一。在 C++11 之前,无论是类模板还是函数模板,都只能按其指定的样子,接受一组固定数量的模板参数;而 C++11 加入了新的表示方法,允许任意个数、任意类别的模板参数,同时也不需要再定义时将参数的个数固定 。
639+ 模板一直是 C++ 所独有的**黑魔法**(一起念:**Dark Magic**)之一。在 C++11 之前,无论是类模板还是函数模板,都只能按其指定的样子,接受一组固定数量的模板参数;而 C++11 加入了新的表示方法,允许任意个数、任意类别的模板参数,同时也不需要在定义时将参数的个数固定 。
642640
643641```cpp
644642template<typename... Ts> class Magic;
@@ -781,7 +779,7 @@ public:
781779 value1 = 1;
782780 }
783781 Base(int value) : Base() { // 委托 Base() 构造函数
784- value2 = 2 ;
782+ value2 = value ;
785783 }
786784};
787785
@@ -805,7 +803,7 @@ public:
805803 value1 = 1;
806804 }
807805 Base(int value) : Base() { // 委托 Base() 构造函数
808- value2 = 2 ;
806+ value2 = value ;
809807 }
810808};
811809class Subclass : public Base {
@@ -873,7 +871,7 @@ void foo(); // 非法, foo 已 final
873871
874872在传统 C++ 中,如果程序员没有提供,编译器会默认为对象生成默认构造函数、复制构造、赋值算符以及析构函数。另外,C++ 也为所有类定义了诸如 ` new ` ` delete ` 这样的运算符。当程序员有需要时,可以重载这部分函数。
875873
876- 这就引发了一些需求:无法精确控制默认函数的生成行为。例如禁止类的拷贝时,必须将赋值构造函数与赋值算符声明为 ` private ` 。尝试使用这些未定义的函数将导致编译或链接错误,则是一种非常不优雅的方式。
874+ 这就引发了一些需求:无法精确控制默认函数的生成行为。例如禁止类的拷贝时,必须将复制构造函数与赋值算符声明为 ` private ` 。尝试使用这些未定义的函数将导致编译或链接错误,则是一种非常不优雅的方式。
877875
878876并且,编译器产生的默认构造函数与用户定义的构造函数无法同时存在。若用户定义了任何构造函数,编译器将不再生成默认构造函数,但有时候我们却希望同时拥有这两种构造函数,这就造成了尴尬。
879877
0 commit comments