【问题标题】:Why is this syntax invalid? vectorPointer->[0]为什么这个语法无效?向量指针->[0]
【发布时间】:2010-12-15 18:00:41
【问题描述】:

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

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

相反,我们要写的比较麻烦

  (*vecPtr)[0] = 1;

我认为,operator[] 调用应该与方法调用具有相同的语法,我讨厌额外的星号和括号。 (我知道 C++ 有很多更严重的问题,但是每次我必须输入它时,这让我很烦......)

【问题讨论】:

  • 不是一个答案,但你为什么要传递一个指向向量的指针而不是通过引用传递向量?这将使函数中的使用更简单,同时您清楚地声明调用者代码负责向量的生命周期。

标签: c++ syntax vector operator-overloading


【解决方案1】:

这是因为语言希望成员出现在-&gt; 之后。语言就是这样组成的。如果您愿意,可以使用函数调用语法

// not really nicer
vecPtr->operator[](0);

如果你必须按顺序做很多,使用[0]代替括号可以大大提高可读性

vecPtr[0][0]

否则,对于一个级别,我发现(*vecPtr)[0] 对我来说是完全可读的。

【讨论】:

  • “作为方法调用的操作符”做得很好......你打败了我:) +1
  • @dehmann,是的,[] 是该运算符的标记,但它的名称是 operator[]。这就是为什么你可以做-&gt;operator[](0)。你不能做-&gt;[0],出于同样的原因你不能做-&gt;++;,尽管我同意能够做-&gt;[0]是一个不错的功能。
  • 有一个usenet线程关于克服-&gt;operator[](i)的确切问题:groups.google.com/group/comp.lang.c++/browse_thread/thread/…
  • 谢谢 litb,现在我看到了问题。
【解决方案2】:

除了litb's nice answer 我应该说vector 类中还有一个函数at 可以让你按如下方式使用它:

 int a = vecPtr->at(0);

此成员函数与成员运算符函数operator[] 之间的区别在于,vector::at 通过抛出out_of_range 异常来发出请求的位置超出范围的信号。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 它是 std::vector 上的一个方法
    • 不,如果你把它写成一个方法,它就是一个方法。正如所写,它是一个运算符(重载,但仍然是一个运算符)。
    猜你喜欢
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2022-06-14
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多