Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么对于引用返回类型的函数,返回指针而不是变量本身是正确的 考虑下面的Bjarne Stroustrup类示例——C++(第二版):_C++_Pointers_Reference - Fatal编程技术网

为什么对于引用返回类型的函数,返回指针而不是变量本身是正确的 考虑下面的Bjarne Stroustrup类示例——C++(第二版):

为什么对于引用返回类型的函数,返回指针而不是变量本身是正确的 考虑下面的Bjarne Stroustrup类示例——C++(第二版):,c++,pointers,reference,C++,Pointers,Reference,据我所知,在double&operator[]方法体中,elem[I](与elem+I相同)具有指向doubledouble*的指针类型 所以,问题是:为什么返回指向double的指针是正确的,尽管方法签名意味着返回对double的引用(变量本身) 此外,如果我尝试返回取消引用的*elem[I]而不是elem[I],编译器将抛出一个错误: 后缀表达式后跟方括号中的表达式是 后缀表达式。其中一个表达式应为glvalue类型 “T数组”或“指向T的指针”类型的PR值,以及其他 应为无范围枚举或整数类

据我所知,在
double&operator[]
方法体中,
elem[I]
(与
elem+I
相同)具有指向double
double*
的指针类型

所以,问题是:为什么返回指向double的指针是正确的,尽管方法签名意味着返回对double的引用(变量本身)

此外,如果我尝试返回取消引用的
*elem[I]
而不是
elem[I]
,编译器将抛出一个错误:

后缀表达式后跟方括号中的表达式是 后缀表达式。其中一个表达式应为glvalue类型 “T数组”或“指向T的指针”类型的PR值,以及其他 应为无范围枚举或整数类型的PR值。这个 结果的类型为“
T
”。类型“
T
”应为完全定义的 对象类型表达式
E1[E2]
*((E1)+(E2))
除了在数组操作数的情况下 如果操作数是左值和x值,则结果是左值 否则表达式
E1
在表达式之前排序
E2


这里,
elem
是类型
double*
,而
i
是类型
int
elem[i]
根据定义相当于
*(elem+i)
,它是
double
类型的左值
*elem[i]
尝试取消对格式不正确的
双精度
的引用。

如果您询问
返回elem[i],不返回指针。
[]
运算符对指针进行去引用。不,
elem[i]
*(elem+i)
相同。星号很重要。该死,我不知道。谢谢你的解释!
class Vector {
public:
    Vector(int s) :elem{new double[s]}, sz{s} { }
    double& operator[](int i) { return elem[i]; }
    int size() { return sz; }
private:
    double* elem;
    int sz = 0;
};