关于引用返回左值和使用decltype返回数组指针的问题?

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<<*p1<cout<<*(*p2+1)<
发现p2竟然是个指向指针的指针,貌似是证明了我的猜想,p2是指向数组整体的,要想访问数组元素,需要两次解引用,这也是为什么decltype(a)*p2=&a;而不是decltype(a)*p2=a;?
不知道自己说的对不对,即使对的话,总感觉自己好差点什么东西没理解,希望大神指导一下,给我一种豁然开朗的感觉!
然后我又测试了一下这个问题,代码如下:
cout<cout<<*p2+1<cout<cout<<&a<cout<<&a+1<
*p2+1只是向前移动一位元素,但是为何&a+1直接跳过整个数组呢?(我还测试数组元素是三个的情况,发现是加12)
以上,写的逻辑很乱,因为很多东西都是我在提问的时候突然想到,然后又在编译器中调试,然后加上来提问的,希望见谅!
烙印99
浏览 545回答 2
2回答

犯罪嫌疑人X

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(...){...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript