我在处理 C++ 中重载成员函数的指针时遇到了一个小问题。以下代码可以正常编译:
class Foo {
public:
float X() const;
void X(const float x);
float Y() const;
void Y(const float y);
};
void (Foo::*func)(const float) = &Foo::X;
但这无法编译(编译器抱怨重载不明确):
void (Foo::*func)(const float) = (someCondition ? &Foo::X : &Foo::Y);
据推测,这与编译器将条件运算符的返回值与函数指针类型分开排序有关?我可以解决这个问题,但我很想知道规范是如何规定所有这些应该工作的,因为它看起来有点不直观,以及是否有某种方法可以解决它,而不会退回到 5 行 if-then-else 。
我正在使用 MSVC++,如果这有什么区别的话。
Thanks!
来自第 13.4/1 节(“重载函数的地址”[over.over]):
在某些上下文中,不带参数的重载函数名称的使用被解析为函数、指向函数的指针或指向重载集中特定函数的成员函数的指针。函数模板名称被认为是在此类上下文中命名一组重载函数。所选函数的类型与上下文中所需的目标类型相匹配。目标可以是
- 正在初始化的对象或引用(8.5、8.5.3),
- 作业的左侧(5.17),
- 函数的参数 (5.2.2),
- 用户定义运算符的参数 (13.5),
- 函数、运算符函数或转换的返回值 (6.6.3),或
- 显式类型转换(5.2.3、5.2.9、5.4)。
重载函数名称前面可以带有&
操作员。在未列出的上下文中,不得在没有参数的情况下使用重载函数名称。 [Note:重载函数名称周围的任何冗余括号都将被忽略 (5.1)。 ]
The target您希望从上面的列表中选择第一个,即正在初始化的对象。但是有一个条件运算符阻碍了这一过程,条件运算符根据其操作数而不是任何目标类型来确定其类型。
由于显式类型转换包含在目标列表中,因此您可以单独对条件表达式中的每个成员指针表达式进行类型转换。我首先创建一个 typedef:
typedef void (Foo::* float_func)(const float);
float_func func = (someCondition ? float_func(&Foo::X) : float_func(&Foo::Y));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)