2011-02-16 73 views
1

考虑下面的代码:结构类型转换

struct A_struct 
{ 
    int x; 
}; 

struct B_struct 
{ 
    int y; 
}; 

int test(A_struct some_struct) 
{ 
    return some_struct.x; 
} 

B_struct B; 

有人能解释这是什么样的类型转换的?

test((A_struct&)B); 

这是实质上等同于:

test(*(A_struct*)&B); 

我主要好奇他们是如何是等价的,因为我有麻烦发现,填补缺口的任何文本。

+0

这是'无效'类型的演员,我相信,虽然我可能是错的。 – Mehrdad 2011-02-16 07:53:45

回答

4

这是一个C风格的演员,允许你做一些非常糟糕的事情,这发生在这个示例中,因为这两个完全不相关的结构的内存布局碰巧匹配。

不要这样做,除非你确切地知道你想要什么,而这就是如何在你使用的每个平台上实现它。

0
test((A&)B); 

不是一个有效的陈述。

虽然假设'B'是结构B的一个实例,但是该语句会盲目地将对象B转换为对'A'类型对象的引用。

+0

同意了,我的示例不完整,现在编辑。 – anon 2011-02-16 08:05:10

0

这是实质上等同于:(!讨厌的东西)

test((A*)&B); 

几乎;-P

test(*(A*)&B); 

1

在这种情况下,这应该是C++ reinterpret_cast相当于:

5.2.10。 reinterpret_cast

类型T1的左值表达式可以是 浇铸到该类型的“参考T2” 如果类型的“指针 T1”的表达可以显式转换到 类型“指针T2“,使用 reinterpret_cast。也就是说, 参考投 reinterpret_cast<T&>(x)具有相同的效果 作为转换 *reinterpret_cast<T*>(&x)与内置&和*运营商。 结果是一个左值,它指与源左值 相同的对象,但具有不同的类型。没有 临时创建,没有副本是 作出,并且构造函数 或转换函数不被调用。