#include <iostream>struct Foo { int sth;};template< class U>voID fun(decltype(U::sth)* i){ std::cout << "1" << std::endl;}template< class U>voID fun(U* i){ std::cout << "2" << std::endl;}voID bun(decltype(Foo::sth)* i){ std::cout << "3" << std::endl;}voID bun(Foo* i){ std::cout << "4" << std::endl;}int main ( ){ fun<Foo>(nullptr); // bun(nullptr); --> call of overloaded 'bun(std::nullptr_t)' is ambiguous return 0; }-----------------------output : 1解决方法 嗯,事实上,GCC accepts your code,but Clang does not.因此,一开始,这个电话是否模糊不清楚.
你问什么规则解决了有趣案例中的含糊之处;海湾合作委员会显然认为有这样的规则.我认为GCC正在应用的规则是规则[over.match.best] /1.7,它更喜欢一个更专业的功能模板而不是一个不太专业的功能模板.
[temp.func.order]中描述了确定哪个函数模板比另一个更专业的过程,并在this SO answer中进行了详细解释.但是,当您尝试将此过程应用于两个有趣的过载时,您会注意到这个问题,我们遇到的问题是,在第一个重载中需要替换U的唯一合成类型需要有一个名为sth的成员,并且没有指定该成员的性质,尽管可能很清楚在第二个有趣的重载中演绎的人必须成功,无论什么类型是什么,编译器可能无法证明它.
这是CWG 1157.由于这个问题仍然没有提出解决方案,我不知道WG21是否打算让这个重载决议成功.
总结以上是内存溢出为你收集整理的c – 使用nullptr作为参数的函数重载决策全部内容,希望文章能够帮你解决c – 使用nullptr作为参数的函数重载决策所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)