c++ - 交换属性 a[i] == i[a]

标签 c++

对于内置类型整数数组来说

int a[10];
int i = 2;
a[i] = 10;

或者

i[a] = 10;

因为

a[i]*(a+i)*(i+a) 的后缀表达式,因为交换属性添加。

我想为用户定义的类型实现它

class Dummy
{
//
};

这可能吗? 如果是那么如何? 如果不是,那是为什么?

编辑:- 我知道它很丑但是下面的代码编译:- g++ -转储版本 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;
}

最佳答案

这是不可能的,因为“operator[] 应该是一个只有一个参数的非静态成员函数”(标准 §13.5.5/1),所以你不能定义第一个参数参数是 native 标量类型。

(此外,非静态运算符重载调用被解释为成员调用,因此第一个操作数不能隐式转换,这与自由函数重载不同。这就是尽可能首选自由函数重载的原因之一。)

无论好坏,index[ object ] 都是一种确保不会调用 operator[] 重载的方法。


不过。

“表达式 E1[E2] 等同于(根据定义)*((E1)+(E2))”(§5.2.1)和 operator+ 可以重载,只要一侧不是 native 类型。这留下了两个选项漏洞:“数组”必须是一个类,或者“索引”必须是一个类或枚举

然后您必须定义一个代理类型来保存“加法”的结果,它定义了一个 operator* 重载。然而,GCC 不支持这一点。我将深入研究其他平台和引用资料。

编辑:啊,§13.6/13 覆盖 5.2.1 并声明,为了解释涉及类或枚举类型的表达式,有函数 T& operator[](std::ptrdiff_t, T* );T& operator[](T*, std::ptrdiff_t);。就是这样。

关于c++ - 交换属性 a[i] == i[a],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612554/

相关文章:

c++ - 允许 C++ 类访问其他类的某些 "internal"成员,但不是私有(private)的?

c++ - 类成员访问 : section 3. 4.5,第 2 点:来自 N3290 draft C++ 的点

c++ - bool 数据类型在 C++ 中是可移植的吗?

java - 在 Java 中仅在堆上创建对象的优缺点是什么?

c++ - 如何编写可移植的 constexpr std::copysign()?

c++ - 如何在 C++ 中创建具有子函数的对象?

c++ - 从客户端程序嗅探 HTTPS 流量

c++ - 如何判断变量是否为指针?

c++ - std::find on map 无法正常运行并遍历 map 的键和值

c++ - 检查对象是否是带有模板的类的实例