请考虑以下代码:
struct X
{
int x;
};
X xInstance;
class A
{
public:
operator X*()
{
return &xInstance;
}
};
int main()
{
A a;
*a = X(); // ok
a[0] = X(); // ok
// a->x = 0; // error
}
A
隐式转换为指针类型。我尝试在三个需要指针的上下文中使用它;两个第一行很好,但是尝试引用struct X
到operator->
的字段,依赖于隐式转换为X*
不起作用。这是为什么?从概念上讲,operator[]
在这种情况下如何与operator->
不同?
使用g++
6.3.0和VC ++ 2017测试。
答案 0 :(得分:6)
标准部分13.6列出了候选运算符函数&#34;代表内置运算符以实现重载分辨率。当运算符@的至少一个子表达式具有类或枚举类型时,考虑用于重载解析的函数列表是 <app-message *ngFor="let message of messages"
[message]="message.message"></app-message>
的非成员查找的联合,operator@
的成员查找,以及这些候选运算符函数。
对于大多数运算符,候选运算符函数通常足以表示内置运算符允许的所有类型。例如,
对于每个cv-qualified或cv-nonqualified对象类型 T ,都存在表单的候选运算符函数
operator@
对于每个cv-qualified或cv-nonqualified对象类型 T ,都存在表单的候选运算符函数
T& operator*(T*);
当您编写T& operator[](T*, std::ptrdiff_t);
T& operator[](std::ptrdiff_t, T*);
或*a
时,相应的候选运算符函数将获得重载解析,子表达式将转换为候选运算符函数的参数类型,然后是普通的内置运算符规则应用
但是,该部分未列出a[0]
的任何候选运算符函数。因此,如果operator->
具有类类型,则a
唯一可能的函数是a->x
的成员查找。 (非成员查找不适用于a.operator->()
,operator->
必须始终是成员函数。)