对于内置类型的整数数组说
int a[10];
int i = 2;
a[i] = 10;
Run Code Online (Sandbox Code Playgroud)
或者
i[a] = 10;
Run Code Online (Sandbox Code Playgroud)
因为
a[i]是一个后缀表达式,*(a+i)或者*(i+a)因为加法的可交换属性.
我希望为用户定义的类型实现这一点
class Dummy
{
//
};
Run Code Online (Sandbox Code Playgroud)
可能吗?如果是,那怎么样?如果没有那么为什么?
编辑: - 我知道它很难看,但代码编译后: - g ++ -dumpversion 4.3.3
#include <stdio.h>
#include<iostream>
#include <string.h>
#include <malloc.h>
using namespace std;
int main()
{
string ArrayS[10];
2[ArrayS] = "ADASD" ;
cout << 2[ArrayS] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Pot*_*ter 15
这是不可能的,因为" operator[]应该是一个只有一个参数的非静态成员函数"(标准§13.5.5/ 1),所以你不能定义它,使得第一个参数是本地标量类型.
(此外,非静态运算符重载调用被解释为成员调用,因此第一个操作数不能被隐式转换,这与自由函数重载不同.这就是为什么在可能的情况下首选自由函数重载的一个原因.)
无论好坏,index[ object ]都是确保不operator[]调用任何重载的方法.
"表达式E1[E2](根据定义)与*((E1)+(E2))"(§5.2.1)相同,只要一方不是本机类型,operator+ 就可以重载.这留下了两个选项漏洞:"数组"必须是类,或者"索引"必须是类或enum.
然后,您必须定义代理类型以保存"添加"的结果,该结果定义了operator*重载.但是,海湾合作委员会不支持这一点.我会更深入地了解其他平台和参考资料.
编辑:啊,§13.6/ 13覆盖5.2.1并声明,为了解释涉及类或枚举类型的表达式,有函数T& operator[](std::ptrdiff_t, T*);和T& operator[](T*, std::ptrdiff_t);.就是这样.
| 归档时间: |
|
| 查看次数: |
1536 次 |
| 最近记录: |