gpt4 book ai didi

c++ - 隐式转换为指针

转载 作者:行者123 更新时间:2023-12-04 12:56:42 25 4
gpt4 key购买 nike

我有这块代码:

struct A
{
operator int*() { return nullptr; }
};
int main()
{
A x;
x[42] = 42;
int z = x[42];
}
令我惊讶的是,以下编译。隐式转换发生并有条件地转换 Aint*并访问指针给定的内存(为了简单起见,我返回了 nullptr)。如 reference说:
每当在不接受该类型但接受其他类型 T2 的上下文中使用某种类型 T1 的表达式时,就会执行隐式转换;特别是:
  • 当表达式被用作操作数时,操作符需要 T2

  • 那么,为什么以下不起作用?
    struct A
    {
    int operator[](int)
    {
    return 42;
    }
    };

    struct B
    {
    operator A()
    {
    return A();
    }
    };

    int main()
    {
    B x;
    int z = x[42];
    x[42] = 42;
    }
    编译器说: error: no match for 'operator[]' (operand types are 'B' and 'int') .我错过了什么?

    最佳答案

    在调用成员函数之前不会应用这些自动转换。一个很好的例子如下

    struct A {
    bool operator<(int) const {
    return true;
    }
    };

    bool operator>(const A &, int) {
    return false;
    }

    struct B {
    operator A() {
    return A();
    }
    };

    int main() {
    B b;
    auto z1 = b > 5; // Works; calls operator<(B::operator A(), int)
    auto z2 = b < 5; // Compile error; tries to call B::operator(int) which does not exist
    }
    你看,我们定义了 <>非常相似,但 <作为成员(member)和 >作为免费功能。对于自由函数,隐式转换已经完成,而对于成员函数则没有。
    将此用于您的示例 int *不是对象,因此它不能有成员函数。所以 operator[]int *基本上是一个自由函数(这并不完全正确,它在语言中更加根深蒂固。但我认为这是一个有用的思考模型)。因此,我们可以拨打 operator[](A::operator int*(), int) .
    您无法为对象类型重现此行为,因为 operator[]不能定义为自由函数(语言就是这样)。

    关于c++ - 隐式转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65937611/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com