(本示例未使用 #include,在 MacOS10.14、Eclipse IDE 上编译,使用 g++,选项 -O0 -g3 -Wall -c -fmessage-length=0)
假设这个变量声明:
int (*fun)(int);
这无法通过“std::toupper 和 std::tolower 的无效重载”进行编译。
fun = (1 ? std::toupper : std::tolower); // ERROR, invalid overload
编译成功:
if (1) {
fun = std::toupper; // OK
}
else {
fun = std::tolower; // OK
}
std::toupper
(1 https://en.cppreference.com/w/cpp/string/byte/toupper and 2 https://en.cppreference.com/w/cpp/locale/toupper) and std::tolower
(1 https://en.cppreference.com/w/cpp/string/byte/tolower and 2 https://en.cppreference.com/w/cpp/locale/tolower) 已超载。当确定它们之间的共同类型时条件运算符 https://en.cppreference.com/w/cpp/language/operator_other#Conditional_operator(在分配给chr2fun
),无法确定应该使用哪个重载。
您可以使用static_cast https://en.cppreference.com/w/cpp/language/static_cast来指定应考虑哪一个。 (前提是,强制过载解析 https://en.cppreference.com/w/cpp/language/overloaded_address首先分别发生,然后确定共同类型的麻烦就消失了。)
static_cast
还可以通过执行特定类型的函数到指针转换来消除函数重载的歧义
e.g.
chr2fun = (str2modus == STR2UP ? static_cast<int(*)(int)>(std::toupper)
: static_cast<int(*)(int)>(std::tolower));
对于第二种情况,chr2fun
直接赋值;的类型chr2fun
是明确的,并且将在中选择正确的重载过载解析 https://en.cppreference.com/w/cpp/language/overloaded_address.
(强调我的)
在所有这些上下文中,从重载集中选择的函数是其类型与目标所期望的函数指针、函数引用或成员函数指针匹配的函数:正在初始化的对象或引用,作业的左侧、函数或运算符参数、函数的返回类型、强制转换的目标类型或模板参数的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)