我需要一个int类型(或类似的)并附加到它的方法。
所以我正在使用:
struct INT{
int i;
operator int(){return i;};
int operator=(int v){return i=v;}
void p(){std::cout<<"i="<<i<<std::endl;}
};
int main(int argc, char **argv)
{
INT X;
int i=8;
X=5;
int j=X+i;
X=j;
(*reinterpret_cast<INT*>(&i)).p();
reinterpret_cast<INT>(i).p();
X.p();
}
虽然第二种形式的reinterpret_cast应该有效,但它没有明显的语义解释。 你知道为什么吗?
答案 0 :(得分:5)
reinterpret_cast
主要用于执行dangerous pointer conversions。当你真正知道自己在做什么时使用它,而不仅仅是关闭编译器。
将指向int *
的{{1}}投射到int
并尝试调用INT *
的成员函数,导致未定义的行为 。符合标准的编译器可以自由地生成代码,从而改变你的硬盘驱动器。
执行此操作的正确方法是在INT
中使用static_cast
转换构造函数:
INT
答案 1 :(得分:3)
与Java不同,C ++具有免费功能:
void p(int i)
{
std::cout<<"i="<<i<<std::endl;
}
因此,我们不需要将方法“附加”到整数。
答案 2 :(得分:2)
由于指针等价,第一次投射有效;也就是说,C和C ++标准明确规定,对于POD struct
,将指向结构的指针强制转换为指向其第一个元素类型的指针是安全的。也就是说,给定
struct S {
T foo;
...
};
S s;
S *pS = &s;
通过如此获得的指针访问foo
是非常合法的:
T *pFoo = (T *)pS;
由于POD类型的性质,由此可以得出:
如果结构只有一个元素,那么总是可以安全地反向转换。
如果结构有多个元素,如果知道指针确实指向结构而不仅仅是指向类型为它的第一个元素。
所以,第一个演员是合法的,不未定义,并且应该始终有效。
另一方面,第二次演员表是有问题的。这样做的原因是编译器不能保证在与指针等效性之外的任何意义上以与第一个元素相同的方式处理单个元素结构。这是有道理的,因为您期望编译器为struct
类型生成的代码与您期望的代码完全不同,例如: int
; int
可能会被分配一个寄存器,但struct
类型通常不会保存在寄存器中,而是存储在堆栈中并由地址引用。因此,reinterpret_cast
根本没有针对您想要的案例进行定义。 good summary of the rules上有一个cppreference.com。