[Item 42]补充关于regex构造的一些说明 (#104)

LGTM
This commit is contained in:
swordsmanbababa 2022-01-05 15:07:19 +08:00 committed by GitHub
parent 777471086e
commit 27dd9cc12d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -231,7 +231,18 @@ std::regex r1 = nullptr; //错误!不能编译
std::regex r2(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`的构造函数。因此: 然后回到`push_back`和`emplace_back`,更一般来说是,插入函数和置入函数的对比。置入函数使用直接初始化,这意味着可能使用`explicit`的构造函数。插入函数使用拷贝初始化,所以不能用`explicit`的构造函数。因此: