如果我有一个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;箭头操作符取消引用指针,是否有理由不期望这会起作用?或者它只是关于语言的那些事情之一?
感谢。
答案 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. & b
,a->^b
从技术上讲,它也适用于较罕见的.*
和->*
。请注意,后者是不 ->
后跟operator*
,而是指向成员指针取消引用的指针。
答案 3 :(得分:0)
->
运算符不仅可以取消引用,还可以访问成员。您正在访问元素 * ,而不是成员。 ->
可以被定义为允许这样做,但事实并非如此。
* 更确切地说,向量允许您访问对象,就像它是数组的元素一样,但它不会改变语法。
答案 4 :(得分:0)
->
运算符是点运算符的替换,除了它首先取消引用指针。它用于访问属性(成员和函数)。对于您的操作,operator[]
是属性。因此,pToVector->operator[](4)
适用于(*pToVector)[4] = 0
答案 5 :(得分:0)
我认为方括号取消了对指针的引用,因此您最终在该位置进行了两次解引用。
ptoVector [4]我认为这已经有用并且足够了,因为方括号会为您取消引用。