如果定义这样一个结构体useless和_type,然后定义t是一个_type结构体:
struct useless
{
};
struct _type
{ useless operator & ()
{
return useless();
}
};
_type t;
怎么求t的地址?
出一想,好像有点难,很显然不能直接用&t来取地址,因为重载了&操作符。
其实这题利用了一个技巧:既然对于t,编译器知道它是_type类型,那么就强制让编译器不把t当成_type类型,就是转换它的“审美观”:(char&)t,或者(int&)t或者(long&)t都可以,whatever,只要你随便强制转换下。
其中(char&)t:的意思是将t的地址一下sizeof(char)字节当成char数据处理,把这块地址当成整数看待,不管原来是什么。
类似的(int&)t:的意思是将t的地址一下sizeof(int)字节当成int数据处理。其余的一样。
只要利用了这一条就可以采用取地址的操作了:&(int&)t就表示t的地址,但是现在:&(int&)t还是一个int*指针, 最好还是转换为_type*指针:
_type* q=(_type*)(&(int&)t);
这句的汇编代码如下:
004113BE lea eax,[t]
004113C1 mov dword ptr [p],eax
另其实如果你写成:int* q=(int*)(&(int&)t);对编译器来说是一样的都是求t的地址:
004113BE lea eax,[t]
004113C1 mov dword ptr [p],eax
只不过,如果你这样写的话,q是一个int*指针,下文你如果想用他操作_type型变量,编译器就会报错而已。
这样就搞定了。有解释不妥的地方,高手斧正。
另外如果向上文中,没有重载const &的话可以这样: const _type* p= (&(const _type)t);来求t的地址。但是如果重载了,如下所示:
useless operator & () const
{
return useless();
}
就只能用上面_type* q=(_type*)(&(int&)t);的方法。