为什么对于引用返回类型的函数,返回指针而不是变量本身是正确的

时间:2019-07-07 13:01:11

标签: c++ pointers reference

请考虑以下示例类,这些类取自 Bjarne Stroustrup-C ++之旅(第二版)

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;
};

据我所知,在double& operator[]方法主体中,elem[i](与elem + i相同)具有双精度double*的指针。 / p>

因此,问题是:为什么方法签名暗示要返回对double 的引用(变量本身),为什么正确返回 pointer to double

此外,如果我尝试返回解引用的*elem[i]而不是elem[i],则编译器将引发错误。

1 个答案:

答案 0 :(得分:0)

[expr.sub]/1

  

后缀表达式后跟方括号的表达式是   后缀表达式。表达式之一应该是类型的glvalue   “ T的数组”或“ T的指针的类型”的prvalue和另一个   应为无作用域枚举或整数类型的prvalue。的   结果的类型为“ T”。类型“ T”应为完全定义的   对象类型。 表达式E1[E2]与(根据定义)与   *((E1)+(E2)) ,但对于数组操作数,则   如果该操作数是左值和x值,则结果是左值   除此以外。表达式E1在表达式之前排序   E2

在这里,elem的类型为double*,而i的类型为int。根据定义,elem[i]等效于*(elem + i),它是类型double的左值。 *elem[i]尝试取消引用格式错误的double