为何无公开间接运算符的auto_gcroot类相关代码可编译?
问题解析:auto_gcroot无公开operator*却能编译通过的原因
问题背景
auto_gcroot类并不具备公开的非const间接运算符(operator*),但以下代码示例却能成功编译,这是为什么?
代码示例:
auto obj = *(std::static_pointer_cast<const auto_gcroot<Object^>>(pObj))
核心原因
这是因为代码里std::static_pointer_cast的目标类型是**const auto_gcroot<Object^>**——也就是一个const限定的auto_gcroot实例。
虽然auto_gcroot没有公开的非const版本operator*,但它大概率提供了const限定的operator*成员函数。在C++的规则里,当操作const对象时,编译器只会匹配带有const修饰的成员函数,所以这个const版本的间接运算符可以被合法调用,让代码顺利编译。
还有一种可能:auto_gcroot实现了const限定的隐式转换函数,可以直接转成Object^。此时对const的auto_gcroot用*时,编译器会先隐式转换得到Object^句柄,再对这个句柄执行间接操作(CLR句柄的*语法上是允许的),同样能让代码编译通过。
内容的提问来源于stack exchange,提问作者Bombocha
相关产品推荐
相关产品推荐

