关于C++中函数调用时隐式转换先于解引用执行的技术问询
关于C++中解引用与隐式转换的优先级发现
我最近在研究C++函数调用的细节时,发现了一个容易被忽略的行为:当对函数调用的参数执行解引用操作时,如果原类型本身不支持解引用,隐式转换会优先于实际的解引用步骤执行。
这个现象可以通过以下代码示例来验证:
struct A{}; struct C { C(const A&) { } }; C operator*(const C&); double f(C); template <typename T> struct t { static const bool value = sizeof(f(**static_cast<T*>(NULL))) == sizeof(double); }; int main(int argc, const char * argv[]) { // 可通过打印t<A>::value的值验证结果 return 0; }
示例逻辑说明:
- 当
T指定为A时,**static_cast<A*>(NULL)的执行流程并非直觉上的“两次解引用A*”(毕竟A本身没有重载operator*,直接解引用A会报错)。 - 实际执行顺序是:先对
A*执行一次解引用得到A对象,接着通过C的构造函数将A隐式转换为C类型,再对这个C对象执行重载的operator*得到新的C对象,最后将该C传入函数f。 - 由于
f返回double,sizeof(f(...))等于sizeof(double),最终t<A>::value会被推导为true,直接验证了隐式转换优先于后续解引用操作的结论。
内容的提问来源于stack exchange,提问作者user42768
相关产品推荐
相关产品推荐

