我正在寻找Stadard的引用描述了以下行为:
以下规则适用于conversion-type-id
查询(3.4.6 / 7):
如果id-expression是转换函数id,则为 首先在对象的类中查找conversion-type-id 使用表达式和名称(如果找到)。否则它会被抬起来 在整个后缀表达式的上下文中。
考虑以下示例:
#include <iostream>
class J{ public: static const char a = 'j'; };
typedef J Y;
class C
{
public:
operator Y(){ std::cout << Y::a; }
};
int main()
{
typedef Y Z;
C *c= new C();
c -> operator Z(); //C::operator Y is invoked
}
我不明白。上面的引用并没有描述这种行为。它仅描述了conversion-type-id
的查找,但它没有描述conversion-function-id
本身。
conversion-function-id
的查找规则是什么?
答案 0 :(得分:1)
如果明确使用 conversion-function-id ,如示例表达式c->operator Z()
中所示,查找规则与任何其他类成员相同。一个技巧是第3节第8段的定义:
如果
,两个名称相同
它们是由相同字符序列组成的标识符,或
他们是由同一个运营商组成的 operator-function-ids ,或者
它们是 conversion-function-ids 形成的相同类型,或
它们是引用相同类或函数的 template-ids ,或
它们是使用相同文字后缀标识符形成的文字运算符的名称。
这里的第三个选项是表达式中使用的名称operator Z
找到类成员C::operator Y()
的原因。它是被访问类中的成员,其名称与表达式 conversion-function-id 的名称相同。