上面程序中对 refcube() 函数两次调用,第一次调用传入了一个常量的参数;第二次调用传递的是一个加法表达式;第三次调用传递的是一个 long 型的变量,类型和形参也不一致,但这三种传递方式都是合法的,因为它符合上面所说的第二种情况:实参的类型不正确,但可以转换为正确的类型。也就是说,常数,表达式,不匹配的类型只要能够转换为形参类型,那么就是合法的。而最后的两种调用明显合法。
在第一到第三种情况里,编译器都将生成一个临时的匿名变量,并让 ra 指向它。这些临时变量只在函数调用期间存在,用完后编译器可以随意将之删除。对于这个临时变量,我们可以将程序简化为在 main() 中只有一条语句如 double c6 = refcube(7.0); ,然后通过反汇编观察到(VS2010):