1.引用返回左值问题int&get(int*array,intindex){returnarry[index];}intmain(){intia[10];for(inti=0;i!=10;++i){get(ia,i)=i;}}这段代码摘自C++primer第五版课后习题exercise6.32书上也明确说“函数的返回类型决定函数调用是否是左值。调用一个返回引用的函数得到左值,其他返回类型得到右值”也就是说因为函数类型是引用类型,所以返回的是左值,所以get(ia,i)是一个左值,所以i才能给get(ia,i)赋值,如果函数声明成intget(int*array,intindex){returnarry[index];}因为函数不是引用类型,返回的是右值,所以不能被赋值,我这样理解没错吧?(可能我描述中有概念弄错,请指出,我感觉我那句“get(ia,i)是一个左值”好像有点概念上描述的错误)希望大神在给我指导一下!谢谢啦!2.intodd[]={1,3,5,7,9};inteven[]={0,2,4,6,8};decltype(odd)*arrPtr(inti){return(i%2)?&odd:&even;}以上代码摘自C++primer第五版6.3.3节内容疑问是为何返回的是&odd(&even)而不是odd(even),数组名不是可以自动变成指向数组首元素的指针吗?下面说一下我的理解,不知道对错?求指导!先举个例子:inta[2]={2,4};int*p1=a;decltype(a)*p2=&a;int*p1=a;这里数组名a自动变成指向数组首元素的指针,这里的指针针对的是数组的某个元素,而decltype(a)获得是数组类型,加上*表示指向含有2个整数的数组的指针,这里的指针是指向数组整体的,而非单个元素,所以需要&a,但是&a的结果不也是数组首元素的地址吗?为何非要写成这种形式呢?直接decltype(a)*p2=a;是错误的。然后我又测试了一下输出代码如下:cout
2 回答
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
7.1.6.2/4Thetypedenotedbydecltype(e)isdefinedasfollows:—ifeisanunparenthesizedid-expressionoranunparenthesizedclassmemberaccess(5.2.5),decltype(e)isthetypeoftheentitynamedbye.Ifthereisnosuchentity,orifenamesasetofoverloadedfunctions,theprogramisill-formed;—otherwise,ifeisanxvalue,decltype(e)isT&&,whereTisthetypeofe;—otherwise,ifeisanlvalue,decltype(e)isT&,whereTisthetypeofe;—otherwise,decltype(e)isthetypeofe.所以decltype(odd)返回的类型是int[5],你所说的自动decay(数组变指针)规则对decltype不生效。这个类型就是个数组,不是指针,也不是元素指针,它的size是sizeof(int[5])而不是sizeof(int),所以你++一下这个类型的指针就跳过了整个数组。如果你要指针,你应该手动decay,比如:std::decay::typearrPtr(...){ ...}
添加回答
举报
0/150
提交
取消