C++ 为什么赢了';t[]括号在取消引用指针时起作用?

C++ 为什么赢了';t[]括号在取消引用指针时起作用?,c++,arrays,pointers,vector,dereference,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

如果我有一个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
//请原谅这里的UB,这只是为了举例说明
std::vector myVector;
std::vector*pToVector;
myVector[4]=0;//很好
(*pToVector)[4]=0;//很好
pToVector->[4]=0;//不起作用
(pToVector->)[4]=0;//不起作用
看起来->箭头操作符取消了指针的引用,有没有理由不认为这会起作用?或者这只是语言的一个方面


谢谢。

后两行的正确语法是:

(*pToVector)[4] = 0; 
//dereference the pointer and then call operator[] on the object returned by the dereference
您可以使用
->
操作符访问以下常规成员函数:

pToVector->size();
从技术上讲,您可以尝试按名称调用
操作符[]
,但它更详细

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

。。。顺便说一下,访问
myVector.size()之外的索引是未定义的行为。这包括代码中带有注释注释的语句,它们是关于
//Works fine

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


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

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

原因是
[]
是一个运算符,短运算符语法不要求或允许成员访问运算符。这适用于成员访问运营商
->
,这很有意义,因为后者只是
(*a).b
的简写

例如,所有不允许的
a.&b
a->^b


从技术上讲,它也适用于较稀有的
*
->*
。请注意,后一个不是
->
,后面跟着
运算符*
,而是指向成员指针解引用的指针。

我认为方括号解引用了指针,因此您在那里两次解引用


ptoVector[4]我认为它是有效的,并且已经足够了,因为方括号为您提供了一个解引用

前两个指定可能看起来有效,但您正在访问容器边界之外的UB。您需要像这样声明它
std::vector myVector(5)
,它将分配必要的空间来访问
myVector[4]
后两个是非法构造。这是不正确的语法。Arrows运算符为您提供*对象。结构使pToVector->[4]=0类似于*pToVector[4]=0。这一行(pToVector->)[4]和这一pToVector->[4]都不起作用。为什么您希望它起作用<代码>a->b表示
(*a).b
。因此,
a->[b]
可能意味着
(*a)。[]
这毫无意义。
->[4]
根本不符合语法。这例如:sencee?请注意,
myVector.[4]
也不起作用。
->
不仅限于数据成员,它还与成员函数一起工作。显然,
operator[]
是一个函数成员,而不是数据。
attribute
word更合适。但我可以指成员和方法,同时说data field@MSalters
attribute
不是一个关键字,它们是完全不同的。而且,“成员和方法”没有什么意义;方法是成员的子集。(即成员功能)。我的意思是“单词”。我想知道为什么像你这样的老家伙对这些东西着迷@MSalters。顺便说一句,
点头就像向瞎马眨眼一样好
如果你认为我们被迷住了,那就去看看编译器的作者吧。我们保持一致是因为这些词有特定的含义,不同的词有不同的含义。例如,因为
main
不是关键字,所以可以将数据成员称为
main
“元素”而不是“成员”?C++没有这样的差异;术语可以互换使用。@ MsAlter有C++标准引用类元素还是数组成员的例子?我没有找到它们,但有可能我忽略了什么。@hvd:我被你的语句误解为“
->
正在访问一个元素”,但没关系。C++没有正式定义元素,标准中只有索引>元素EntyType < /Cude>,但1.8/2没有太大疑问。也就是说,在这个问题中,
[]
不访问数组元素,而是引用成员函数
运算符[]
。相同的标记,不同的含义。@MSalters Fair point,重载的
运算符[]
表示它是一个只假装有元素的类。我会编辑的,谢谢。我喜欢听他们的经历。尽管如此,我还是受够了这里@hvd的老板们的困扰
pToVector->operator[](4)