Pet*_*ter 5 c++ function-pointers conditional-operator
我在处理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;
Run Code Online (Sandbox Code Playgroud)
但是这不会编译(编译器抱怨重载是不明确的):
void (Foo::*func)(const float) = (someCondition ? &Foo::X : &Foo::Y);
Run Code Online (Sandbox Code Playgroud)
大概这与编译器分离出条件运算符的返回值和函数指针类型有关吗?我可以解决它,但我很想知道规范如何说这一切应该工作,因为它似乎有点不直观,如果有一些方法可以解决它而不会回到5行if-then-else .
我正在使用MSVC++,如果这有任何区别.
谢谢!
从第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).
过载函数名称可以在
&运算符之前.除了列出的上下文之外的上下文中,不应使用重载函数名称.[ 注意:忽略重载函数名称周围的任何多余括号(5.1).]
您希望从上面的列表中选择的目标是第一个,正在初始化的对象.但是有一个条件运算符,条件运算符从它们的操作数确定它们的类型,而不是从任何目标类型.
由于显式类型转换包含在目标列表中,因此可以分别在条件表达式中类型转换每个成员指针表达式.我先做一个typedef:
typedef void (Foo::* float_func)(const float);
float_func func = (someCondition ? float_func(&Foo::X) : float_func(&Foo::Y));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1186 次 |
| 最近记录: |