C++表达式int*&& x = new int[10]()的类型转换与合法性问询
结论先行
int*&& x = new int[10](); 是完全合法的C++表达式,不存在未定义行为。
你的分析误区
你错误地将new表达式内部的初始化语义和外层表达式的求值规则混淆了:int[10]()作为值初始化的语法,仅作用于new运算符在堆上分配的数组对象,这个过程是new表达式内部的隐式操作,不会产生暴露到外层的、类型为int[10]的纯右值,自然不存在你假设的“int[10]类型纯右值需要临时量实质化”的场景,你找不到对应触发条件是很正常的,因为这个转换根本不会发生。
正确的类型转换流程
- 整个
new int[10]()表达式的类型是int*,值类别为纯右值,这部分你的判断是对的。 - 当纯右值需要绑定到同类型的右值引用时,会触发临时量实质化:把
int*类型的纯右值转换为代表int*临时对象的亡值,int*&&类型的引用x会直接绑定到这个临时指针对象上,完全符合C++标准的绑定规则。 - 后续你可以正常通过
x访问数组元素,只要最终执行delete[] x;释放内存,就不会有任何问题。
内容的提问来源于stack exchange,提问作者domdrag
相关产品推荐
相关产品推荐

