是的,这不是很便携,我想知道为什么要做这样的事情:`
char *cp ;
reinterpret_cast<char *&>(a) = cp;
`它意味着什么?
THX
答案 0 :(得分:2)
a
已投放到char*&
。它被称为reinterpret_cast
,因为这些位以完全按照强制转换目标类型请求的方式重新解释。编译器不检查有效性(他也不能)。这会使指针返回原点:它只是一块内存的地址。
将a
转换为对指针的引用的原因是需要引用才能有一个有效的左值来分配cp
。 reinterpret_cast<char *>(a) = cp
本来是非法的,因为你不能分配给临时的。
源代码看起来有点难看。这一个:
char* c = reinterpret_cast<char*>(a);
c = cp;
可能更好地维护和阅读,虽然它更长(注意它并不完全相同,因为我们引入了额外的变量c
来保存演员的结果。在原始样本中,{{ 1}}的内存被重用于指向新位置a
)。
答案 1 :(得分:0)
有些人对演员阵容中的引用感到困惑。没有参考,我们会有这样的事情:
T a; // whatever a is, we don't know
char* cp; // or something convertible to char*
// remember, this is not what actually gets generated
char* some_temporary_rvalue = reinterpret_cast<char*>(a);
some_temporary_rvalue = cp; // illegal, and senseless
随着参考,它变成:
T a; // whatever a is, we don't know
char* cp; // or something convertible to char*
char*& a_treated_as_charptr = reinterpret_cast<char*&>(a);
a_treated_as_charptr = cp; // assigns a char* that is at &a
答案 2 :(得分:-1)
问题中缺少的有趣部分是a
的类型。我可以假设它是某种指针(它实际上可以是任何东西,但这种假设使讨论更简单)。
T *a;
char* p = "Hello";
reinterpret_cast<char*&>(a) = p;
假设a
实际上是指向另一个类型的指针,操作的结果将等同于:
T *a;
char *p = "Hello";
a = reinterpret_cast<T*>(p); // convert p to a T* and assign
不同之处在于,在第一个版本中,强制转换是在赋值的左侧(LHS)执行的,因此必须是对参考(左值)的强制转换,而在第二种情况下,执行强制转换在右侧(RHS),因此右值足够,无需投射参考。
现在,在一般情况下,两个演员阵容存在差异。重新解释强制转换会将内存“重新解释”为您告诉它的类型。如果a
和char*
的类型具有相同的大小(在上面假设的情况下,所有指针都具有相同的大小),那么这两个操作是相同的并产生相同的结果。< / p>
另一方面,如果一种类型比另一种大,那么这两种操作就不相同。如果sizeof(a) > sizeof(char*)
,则第一个版本将重新解释该变量,并仅覆盖sizeof(char*)
的{{1}}个字节,其值为a
。在第二种情况下,它将从p
的内存位置读取sizeof(a)
个字节(导致未定义的行为,因为它将在变量之外读取)并复制这些字节,覆盖{{1}中的所有先前字节}。
如果p
相反,则第一个版本将覆盖超出分配的a
空间导致未定义的行为,而第二个版本将覆盖sizeof(a) < sizeof(char*)
第一个a
a
中的字节数。