c++ 参数类型不同修饰(const/volatile//)的函数重载优先级
测试编译器:VS2022 c++latest
测试方法: 写出如下特化类,然后尝试调用print(),如果编译器报调用不明确,那么表示当前级别有多个重载函数,把被提示的重载全部注释,编译器会提示下一组,如果当前级别仅有一个重载,则编译器会在连接阶段报符号未定义,也把这个未定义函数注释掉。最后编译器会到达void foo(...){},则已经穷尽了所有匹配。
#define foo(T) void foo(T b);
template<typename Input, typename Base>
struct Priority;
template<typename Base>
struct Priority<Base&&, Base>
{
using Input = Base&&;
const char* str;
foo(Base);
foo(Base&);
foo(Base&&);
foo(const Base&);
foo(const Base&&);
foo(volatile Base &);
foo(volatile Base&&);
foo(const volatile Base&&);
// void (foo)(...){}
void print()
{
Base b = {};
(foo)((Input)b);
}
};
: