请考虑以下示例类,这些类取自 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]
,则编译器将引发错误。
答案 0 :(得分:0)
后缀表达式后跟方括号的表达式是 后缀表达式。表达式之一应该是类型的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
。