整数提升:
小整数类型(例如 char)的纯右值可以转换为较大整数类型(例如 int)的纯右值。[...]
请注意,所有其他转化均不属于促销;例如,重载决策选择 char -> int (提升)而不是 char -> Short (转换)。
从char到int的转换就是‘提升’;很清楚(从1字节到4字节)。
从 char -> Short 的转换是“不提升”;为什么?
我一直认为char是一个字节,short(short int)是两个字节。为什么它不被视为促销?这似乎与第一行相矛盾。难道‘小改大’就是升职吗?)
寻找一些答案后:
我们可以考虑“促销是转化的特例”吗?我们是否可以说“所有促销都是转化,但并非所有转化都是促销”?
或者我们应该将它们视为两个不同且独立的概念?
我读过显式类型转换(我的重点):
当遇到C 风格的强制转换表达式时,编译器会尝试将其解释为以下强制转换表达式(按以下顺序):
const_cast<target-type>(expression);static_cast<target-type>(expression),带有扩展:即使基类不可访问(即,此转换忽略私有继承说明符),也允许将派生类的指针或引用强制转换为明确基类的指针或引用(反之亦然)。这同样适用于将指向成员的指针转换为指向明确非虚拟基的成员的指针;static_cast(带有扩展名)后跟const_cast;reinterpret_cast<target-type>(expression);reinterpret_cast其次是const_cast。
第 2 项和第 3 项中的“带扩展名”是什么意思?如果可能的话,我想要一个带扩展名和不带扩展名(如果有)的转换示例。
我应该在下面的示例中使用“删除”吗?
int main(){
T object;
T* pointer = new T[4];
delete[] pointer; // this line is redudant? or error?
pointer = &object;
}
Run Code Online (Sandbox Code Playgroud)
我向 Chat GPT 询问同样的问题,它说:“行删除是多余的,可能会导致未定义的行为,因为当您重新分配指针时,堆上的数据会自动释放”。但我对此有疑问。那么我应该在那里使用“删除”吗?