From 1b4847b8f84ac2df4115138deed8666c751d0831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=AB=E8=80=B3=E5=A0=80=E5=B7=9D=E9=9B=B7=E9=BC=93?= <58223265+neko-horikawaraiko@users.noreply.github.com> Date: Mon, 15 Mar 2021 20:02:06 +0800 Subject: [PATCH] Update item26.md --- 5.RRefMovSemPerfForw/item26.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.RRefMovSemPerfForw/item26.md b/5.RRefMovSemPerfForw/item26.md index 41981a9..aa4816d 100644 --- a/5.RRefMovSemPerfForw/item26.md +++ b/5.RRefMovSemPerfForw/item26.md @@ -85,7 +85,7 @@ logAndAdd(nameIdx); //错误! 最后一行的注释并不清楚明白,下面让我来说明发生了什么。 -有两个重载的`logAndAdd`。使用通用引用的那个推导出`T`的类型是`short`,因此可以精确匹配。对于`int`类型形参的重载也可以在`short`类型提升后匹配成功。根据正常的重载解决规则,精确匹配优先于类型提升的匹配,所以被调用的是通用引用的重载。 +有两个重载的`logAndAdd`。使用通用引用的那个推导出`T`的类型是`short`,因此可以精确匹配。对于`int`类型参数的重载也可以在`short`类型提升后匹配成功。根据正常的重载解决规则,精确匹配优先于类型提升的匹配,所以被调用的是通用引用的重载。 在通用引用那个重载中,`name`形参绑定到要传入的`short`上,然后`name`被`std::forward`给`names`(一个`std::multiset`)的`emplace`成员函数,然后又被转发给`std::string`构造函数。`std::string`没有接受`short`的构造函数,所以`logAndAdd`调用里的`multiset::emplace`调用里的`std::string`构造函数调用失败。(译者注:这句话比较绕,实际上就是调用链。)所有这一切的原因就是对于`short`类型通用引用重载优先于`int`类型的重载。