Tuesday, November 4, 2008

icc, vc2005, gcc4.2的参数入栈顺序和强制类型转化的一个case






icc, vc2005, gcc4.2的参数入栈顺序和强制类型转化的一个case

为方便描述, 想想如下的情况

有4个类型TA, TB,
              TA_meta, TB_meta,

存在如下的关系, 从TA可以转化成TA_meta, 
                       从TB可以转化成TB_meta,
                       从TA_meta<-->TB_meta,

...
TA:: operator TA_meta (const TA& );//从TA转化成TA_meta的函数
TA:: operator TA_meta (const TB& );//从TB转化成TA_meta的函数, 这里先把TB-->TB_meta, 然后吧TB_meta-->TA_meta

为方便我们需要引入另外一个类型 CC.
有一个函数如下:
foo(CC,  TA_meta);

调用者如下:
CC obj1;
TA ta;

foo(obj1, ta); //这里需要把ta--->ta对应的TA_meta

下面给出信息:
             |     编译器                   参数入栈顺序                            调用的转化函数  
------------------------------------------------------------------------------------
windows|     vc                         自右向左                             TA:: operator TA_meta (const TA& )    
             |     icc                         自左向右                             TA:: operator TA_meta (const TB& )---icc 疯了
-------------------------------------------------------------------------------------
linux      |     gcc                        自右向左                            TA:: operator TA_meta (const TA& )
            |      icc                         自左向右                            TA:: operator TA_meta (const TA& )






No comments: