作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这块代码:
struct A
{
operator int*() { return nullptr; }
};
int main()
{
A x;
x[42] = 42;
int z = x[42];
}
令我惊讶的是,以下编译。隐式转换发生并有条件地转换
A
至
int*
并访问指针给定的内存(为了简单起见,我返回了
nullptr
)。如
reference说:
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/
我是一名优秀的程序员,十分优秀!