为什么这种语法无效? vectorPointer-> [0]

时间:2009-11-12 04:43:10

标签: c++ syntax vector operator-overloading

C++中,为什么vector中的以下元素访问无效?

void foo(std::vector<int>* vecPtr) {
  int n = vecPtr->size(); // ok
  int a = vecPtr->[0];    // invalid
}

相反,我们必须编写更麻烦的

  (*vecPtr)[0] = 1;

我认为,operator[]调用应该具有与方法调用相同的语法,并且我讨厌额外的星号和括号。 (我知道C ++有很多严重的问题,但每当我输入它时,这个问题都会让我很烦恼。)

3 个答案:

答案 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)

你似乎已经知道那应该是无效的语法,那么问题是什么?写的唯一答案是“因为这就是编写语言的方式”。

从语义上讲,这是因为[]运算符实际上是在说“从提供的地址计算偏移量”;它不是一种方法,而是一个操作员。你给出的语法并不是真的有意义。

此外,因为您描述的语法看起来很糟糕,因为您只是指向一个裸操作符而不是预期的成员。

如果您想更直接地了解间接(符号崩溃),请考虑使用引用。