解除引用指针时,为什么[]括号不起作用?

时间:2017-01-22 21:43:14

标签: c++ arrays pointers vector dereference

如果我有一个std :: vector,我可以访问一个成员,因为方括号运算符在vector类中被重载。如果我有一个指向矢量的指针,我可以取消引用指针并使用此运算符。但是用箭头 - >操作员它不会让我使用它。例如:

 // Excuse the UB here, it's just for illustration
    std::vector<int> myVector;    
    std::vector<int>* pToVector;
    myVector[4] = 0;                   // Works fine
    (*pToVector)[4] = 0;               // Works fine
    pToVector->[4] = 0;                // Doesn't work
    (pToVector->)[4] = 0;              // Doesn't work

看起来好像是 - &gt;箭头操作符取消引用指针,是否有理由不期望这会起作用?或者它只是关于语言的那些事情之一?

感谢。

6 个答案:

答案 0 :(得分:4)

std::vector<int> myVector;    
std::vector<int>* pToVector;
myVector[4] = 0;                   // Works fine.
(*pToVector)[4] = 0;               // Works fine
pToVector->[4] = 0;                // Doesn't work
(pToVector->)[4] = 0;              // Doesn't work

如果必须使用指向对象的指针来访问对象类的重载运算符,则必须明确调用它。

pToVector->operator[](4)

...顺便说一下,访问myVector.size()之外的索引是Undefined Behavior。这包括代码中带有注释注释的语句// Works fine

答案 1 :(得分:2)

后两行的正确语法是:

(*pToVector)[4] = 0; 
//dereference the pointer and then call operator[] on the object returned by the dereference

您可以使用->运算符来访问常规成员函数,如下所示:

pToVector->size();

从技术上讲,您可以尝试按名称调用operator[],但它更详细。

答案 2 :(得分:1)

原因是[]是运算符,短运算符语法不需要或允许成员访问运算符。这适用于成员访问运算符.->,这是有道理的,因为后者只是(*a).b的简写。

E.g。所有不允许a. & ba->^b

从技术上讲,它也适用于较罕见的.*->*。请注意,后者是 ->后跟operator*,而是指向成员指针取消引用的指针。

答案 3 :(得分:0)

->运算符不仅可以取消引用,还可以访问成员。您正在访问元素 * ,而不是成员。 ->可以被定义为允许这样做,但事实并非如此。

* 更确切地说,向量允许您访问对象,就像它是数组的元素一样,但它不会改变语法。

答案 4 :(得分:0)

->运算符是点运算符的替换,除了它首先取消引用指针。它用于访问属性(成员和函数)。对于您的操作,operator[]是属性。因此,pToVector->operator[](4)适用于(*pToVector)[4] = 0

答案 5 :(得分:0)

我认为方括号取消了对指针的引用,因此您最终在该位置进行了两次解引用。

ptoVector [4]我认为这已经有用并且足够了,因为方括号会为您取消引用。