作者:弯弯的丝瓜
函数func的定义如下:
1 2 3 4 5 | voidfunc(constint& v1,constint& v2) { std::cout << v1 <<' '; std::cout << v2 <<' '; } |
1 2 3 4 5 6 | intmain (intargc,char* argv[]) { int i=0; func(++i,i++); return0; } |
以上为题干,输出2 0.
重点不是什么先++ 后++的问题。(当然解题技巧还是在从右往左的压栈顺序)
void func(const int& v1, const int & v2)
{
cout << "&v1 = "<< &v1 << endl;
cout << "&v2 = " << &v2 << endl;
std::cout <<"v1 = "<< v1 << ' ';
std::cout <<"v2 = "<< v2 << ' ';
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
cout <<"&i = "<< &i << endl;
func(++i, i++);
system("pause");
return 0;
}
以下为VS2013测试结果
&i = 004FFA04
&v1 = 004FFA04
&v2 = 004FF938
v1 = 2 v2 = 0 请按任意键继续. . .
经过推理,最终落脚在i++,个人认为,在执行i++的之后会由编译器先制作一个副本变量,存储++之前需要处理的值,作用域类被严格限制。
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
int a = 0;
cout << "&a = " << &a << endl;
const int &b = a++;
cout << "&b = " << &b << endl;
cout << "&a = " << &a << endl;
cout <<"&i = "<< &i << endl;
system("pause");
return 0;
}
最终结论:
i++之前会返回一个右值引用;(每次读不懂的语句,好像都会落在这个点子上)
归结于如何使用右值一类问题。
参靠下面这个例子
int&& iii = 10;
int& ii = iii;
将形参传递过程抽象出来:
const int & v2 = i++;
//展开:
int&& temp = i++;
int& v2 = temp;
将函数优化为:(避免读不懂)
void func(const int& v1, int && v2)
{
cout << "&v1 = "<< &v1 << endl;
cout << "&v2 = " << &v2 << endl;
std::cout <<"v1 = "<< v1 << ' ';
std::cout <<"v2 = "<< v2 << ' ';
}
附上左值右值深度好文:
https://www.cnblogs.com/likaiming/p/9045642.html