gpt4 book ai didi

c++ - "deduced A"在调用类型推导的上下文中的含义

转载 作者:行者123 更新时间:2023-11-30 02:15:58 26 4
gpt4 key购买 nike

If P is a class and P has the form simple-template-id, then the transformed A can be a derived class D of the deduced A.

from [temp.deduct.call]4.3

这句话描述了如果函数模板参数是从“deduced A”派生的如何仍然有效,但是对于什么是“deduced A”并没有明确的定义"实际上是。

我的理论是推导A是原始的P,其中替换了A的模板参数,但这会破坏类型推导的规则试图找到使 A 和推导的 A 相同的模板参数,因为在某些情况下 A 是非引用而推导的 A 是一个引用。

最佳答案

函数模板参数推导的目标是找出在模板名称像函数名称一样使用的地方应该使用函数模板的哪个特定特化。例如,给定一个函数模板

template <typename T>
void f(T* value) {}

当你有一个像这样的函数调用时

int* a = &x;
f(a);

名字f这里其实不是函数名,而是函数模板名。编译器必须根据函数调用中给定的参数类型,确定该调用实际上应该调用函数模板的哪个具体特化。换句话说,它必须找出哪个模板参数X。应该用于模板参数 T获得实际功能 f<X>可以在这里这样称呼。与正常的函数调用相比,这有点逆向问题。不必使参数列表适合给定的签名(通过应用转换),我们现在必须使签名适合给定的参数列表。另一种看待它的方式是尝试推导模板参数,使每个函数参数的类型与每个函数调用参数的类型相匹配。这就是[temp.deduct.call]/4在这里谈论:

In general, the deduction process attempts to find template argument values that will make the deduced A identical to A

以我们上面的例子为例,给定一些推导的模板参数 X ,推导的参数类型是我们通过替换推导的 X 得到的。对于 T进入我们的函数参数类型 T* (即,此函数参数采用的参数类型)。如果我们推断X成为int , 代替 int对于 T进入T*使我们推断的参数类型成为 int* .由于推导的参数类型 int*与实际参数的类型相同,我们发现函数 f<int>正是我们要找的。

为了使所有这些与正常函数调用的行为方式一致,需要处理一些特殊情况。特别是对于数组和函数类型的函数调用参数,我们通常有数组到指针和函数到指针的衰减,以及顶级常量。为了解决这个问题,标准规定参数类型 A我们试图匹配的不是简单地直接作为相应函数调用参数的类型,而是首先通过应用数组到指针、函数到指针等转换转换 .这转变 AA我们实际上是在尝试使推导的参数类型匹配。这只是为了解释为什么标准在那里谈论“转换后的 A”。对于手头的问题来说,这并不是那么重要。改造后的 A只是我们实际尝试匹配的函数参数类型。

现在,假设我们有一些

template <typename T> class B {};

和一些派生类

class D : public B<int> {};

当你有一个像这样的函数模板时

template <typename T>
void f(const B<T>*) {}

和这样的函数调用

D d;
f(&d);

没有模板参数X你可以选择T这将使推导的参数类型为 const B<X>*等于 D* .但是因为 D源自 B<int> , 推断模板参数为 int尽管如此,还是会导致函数特化 f<int>那可以接电话。全款[temp.deduct.call]/4.3尤其是你问题中的句子

If P is a class and P has the form simple-template-id, then the transformed A can be a derived class D of the deduced A.

是否可以让这个正常工作......

关于c++ - "deduced A"在调用类型推导的上下文中的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55560863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com