【问题标题】:operator & overload and indexing in C++C++ 中的运算符、重载和索引
【发布时间】:2021-09-17 10:46:18
【问题描述】:

是否可以创建允许传递 arg 的“地址”(&) 运算符重载?重载运算符 [] 和运算符 & 之间的混合体。

所以常规的[]重载可以这样使用

val = myobj[arg];

地点:

SomeReturnType MyClass::operator[](SomeArgType i)
{
   // Code to handle indexing
}

但如果我们想要一个指向该项目的指针,我正在寻找的将提供这种用途:

ptr = &myobj[arg];

也许这不能直接实现,我知道还有其他方法可以实现,但如果可以,我不知道语法。

【问题讨论】:

  • 你有理由超载&吗?
  • 这听起来像是一个 XY 问题。你能详细说明一下你为什么要这样做吗?
  • 如果你把它设为SomeReturnType& MyClass::operator[](SomeArgType i),你将获得一个指向带有ptr = &myobj[arg];的索引元素的指针,而不会重载地址运算符。
  • 如果operator[] 通过引用返回,ptr = &myobj[arg]; 将正常工作。
  • 这取决于SomeReturnType 是什么。您可以将其编码为项目的副本或对其的引用(具有一些有趣的功能)。

标签: c++ pointers operator-overloading


【解决方案1】:

operator[]返回引用时,不需要重载操作符的地址:

#include <iostream>

struct foo {
    int x;
    int& operator[](int){
        return x;
    }
};


int main() {
    foo f;
    std::cout << &f.x << "\n";
    std::cout << &f[42] << "\n";
}

Possible output:

0x7ffc8cd2d46c
0x7ffc8cd2d46c

该示例仅使用了一个int,但当operator[] 返回对某个容器元素的引用时,它也是一样的。

operator[] 返回一个副本,然后通过operator&amp; 重载获取原始元素的地址是不可能的(除非您返回一些包含元素副本和原始地址的代理,来自operator[])。

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2012-11-26
    相关资源
    最近更新 更多