代码之家  ›  专栏  ›  技术社区  ›  Frank

为什么这个语法无效?矢量指向器->[0]

  •  1
  • Frank  · 技术社区  · 15 年前

    C++ ,为什么在 vector 无效?

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

    相反,我们得写得越繁琐

      (*vecPtr)[0] = 1;
    

    我想, operator[] 调用的语法应该与方法调用相同,我讨厌多余的星号和括号。(我知道C++有很多更严重的问题,但每次我不得不键入它时,这个问题就让我恼火……)

    3 回复  |  直到 15 年前
        1
  •  12
  •   Johannes Schaub - litb    15 年前

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

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

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

    vecPtr[0][0]
    

    否则,在一个层面上,我发现 (*vecPtr)[0] 对我来说是完全可读的。

        2
  •  5
  •   Community CDub    8 年前

    除了 litb's nice answer 我应该说有一个函数 at 在里面 vector 类,该类允许您使用它,如下所示:

     int a = vecPtr->at(0);
    

    这个成员函数和成员运算符函数的区别 operator[] 是吗? vector::at 如果请求的位置超出范围,则通过抛出 out_of_range 例外。

        3
  •  0
  •   phoebus    15 年前

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

    从语义上讲,这是因为[]运算符本质上是在说“从提供的地址计算偏移量”;它不是一个方法,而是一个运算符。你给出的语法感觉不太合理。

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

    如果您想更直接地了解间接性,请考虑使用引用( 符号碰撞 )

    推荐文章