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。
存在两个问题:
1. 为什么模板可以推断类型为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?
谢谢。
B
时,编译器不会违反访问控制吗? - CaesarB
,但我们不是通过名称访问它。 - Barry