gpt4 book ai didi

C++-转换函数模板推导,为什么会这样?

转载 作者:可可西里 更新时间:2023-11-01 17:56:37 26 4
gpt4 key购买 nike

class A
{
struct B{};
public:
static void test(A::B){}
};

struct C
{
template<class T>
operator T()
{
return T();
}
};

int main()
{
A::test(C());
}

此代码适用于 clang 3.7、gcc 5.1 和 vc++ 14.2。
2个问题,
1、为什么template可以推导出类型是A::B? (太聪明了!)
据我所知,模板通过返回语句而不是参数来推断类型。
但是我发现了一些对 N4606 12.3.2 6 感兴趣的东西 A conversion function template shall not have a deduced return type (7.1.7.4).(但是,我找不到关于这个的更多信息,因为 7.1.7.4太难理解了。)
2. 为什么转换函数模板可以访问A::B?

谢谢。

最佳答案

  1. Why can template deduce the type is A::B? (so smart!)

test()需要 A::B , 你需要一种方法来转换 CA::B .我们可以尝试通过转换函数进行初始化,我们在 [over.match.conv] 中有:

The conversion functions of S and its base classes are considered. Those non-explicit conversion functions that are not hidden within S and yield type T or a type that can be converted to type T via a standard conversion sequence (13.3.3.1.1) are candidate functions.

我们根据[temp.conv]进行模板推导:

Template argument deduction is done by comparing the return type of the conversion function template (call it P) with the type that is required as the result of the conversion (call it A; see 8.6, 13.3.1.5, and 13.3.1.6 for the determination of that type) as described in 14.8.2.5.

基本上,我们推断出 Ttemplate <class T> operator T()成为A::B .这是一个格式正确的转换序列,也是唯一可行的,所以就是这样。

您引用的关于“推导的返回类型”的行是指 autodecltype在返回类型中。这不会发生在这里。

  1. Why could conversion function template access A::B?

访问规则严格与名称有关。 姓名 B ,只有名字是A 私有(private)的.但我们不是在访问名称,而是直接推断类型。

B的构造函数是公共(public)的,因此转换函数的主体也是合式的,因此代码的所有内容都是合式的。

关于C++-转换函数模板推导,为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659011/

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