mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-02-04 16:20:31 +08:00
parent
777471086e
commit
27dd9cc12d
@ -231,7 +231,18 @@ std::regex r1 = nullptr; //错误!不能编译
|
||||
std::regex r2(nullptr); //可以编译
|
||||
```
|
||||
|
||||
在标准的官方术语中,用于初始化`r1`的语法(使用等号)是所谓的**拷贝初始化**。相反,用于初始化`r2`的语法是(使用小括号,有时也用花括号)被称为**直接初始化**。拷贝初始化不被允许使用`explicit`构造函数(译者注:即没法调用相应类的`explicit`拷贝构造函数),直接初始化却被允许。这就是初始化`r1`不能编译,而初始化`r2`可以编译的原因。
|
||||
|
||||
在标准的官方术语中,用于初始化`r1`的语法(使用等号)是所谓的**拷贝初始化**。相反,用于初始化`r2`的语法是(使用小括号,有时也用花括号)被称为**直接初始化**。
|
||||
|
||||
```cpp
|
||||
using regex = basic_regex<char>;
|
||||
|
||||
explicit basic_regex(const char* ptr,flag_type flags); //定义 (1)explicit构造函数
|
||||
|
||||
basic_regex(const basic_regex& right); //定义 (2)拷贝构造函数
|
||||
```
|
||||
拷贝初始化不被允许使用`explicit`构造函数(译者注:即没法调用相应类的`explicit`拷贝构造函数):对于`r1`,使用赋值运算符定义变量时将调用拷贝构造函数`定义 (2)`,其形参类型为`basic_regex&`。因此`nullptr`首先需要隐式装换为`basic_regex`。而根据`定义 (1)`中的`explicit`,这样的隐式转换不被允许,从而产生编译时期的报错。对于直接初始化,编译器会自动选择与提供的参数最匹配的构造函数,即`定义 (1)`。就是初始化`r1`不能编译,而初始化`r2`可以编译的原因。
|
||||
|
||||
|
||||
然后回到`push_back`和`emplace_back`,更一般来说是,插入函数和置入函数的对比。置入函数使用直接初始化,这意味着可能使用`explicit`的构造函数。插入函数使用拷贝初始化,所以不能用`explicit`的构造函数。因此:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user