From 27dd9cc12d86328794a252eb5f65e8078729d745 Mon Sep 17 00:00:00 2001 From: swordsmanbababa <773709579@qq.com> Date: Wed, 5 Jan 2022 15:07:19 +0800 Subject: [PATCH] =?UTF-8?q?[Item=2042]=E8=A1=A5=E5=85=85=E5=85=B3=E4=BA=8E?= =?UTF-8?q?regex=E6=9E=84=E9=80=A0=E7=9A=84=E4=B8=80=E4=BA=9B=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=20(#104)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LGTM --- 8.Tweaks/item42.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/8.Tweaks/item42.md b/8.Tweaks/item42.md index ec59dd1..81b996b 100644 --- a/8.Tweaks/item42.md +++ b/8.Tweaks/item42.md @@ -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; + +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`的构造函数。因此: