在C++
中,为什么vector
中的以下元素访问无效?
void foo(std::vector<int>* vecPtr) {
int n = vecPtr->size(); // ok
int a = vecPtr->[0]; // invalid
}
相反,我们必须编写更麻烦的
(*vecPtr)[0] = 1;
我认为,operator[]
调用应该具有与方法调用相同的语法,并且我讨厌额外的星号和括号。 (我知道C ++有很多严重的问题,但每当我输入它时,这个问题都会让我很烦恼。)
答案 0 :(得分:12)
这是因为该语言希望成员出现在->
之后。这就是语言的组成方式。如果您愿意,可以使用函数调用语法
// not really nicer
vecPtr->operator[](0);
如果您必须按顺序执行很多,使用[0]
代替括号可以大大提高可读性
vecPtr[0][0]
否则,对于一个级别,我发现(*vecPtr)[0]
对我来说是完全可读的。
答案 1 :(得分:5)
除了litb's nice answer之外,我应该说vector
类中有一个函数at
,允许您按如下方式使用它:
int a = vecPtr->at(0);
此成员函数与成员运算符函数operator[]
之间的区别在于vector::at
表示如果请求的位置超出范围,则会抛出out_of_range
异常。
答案 2 :(得分:0)
你似乎已经知道那应该是无效的语法,那么问题是什么?写的唯一答案是“因为这就是编写语言的方式”。
从语义上讲,这是因为[]运算符实际上是在说“从提供的地址计算偏移量”;它不是一种方法,而是一个操作员。你给出的语法并不是真的有意义。
此外,因为您描述的语法看起来很糟糕,因为您只是指向一个裸操作符而不是预期的成员。
如果您想更直接地了解间接(符号崩溃),请考虑使用引用。