【发布时间】:2017-06-07 09:07:21
【问题描述】:
如果我有一个 std::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
看起来好像 -> 箭头运算符取消了指针的引用,是否有理由不期望这会起作用?或者它只是语言的其中之一?
谢谢。
【问题讨论】:
-
前 2 个分配可能看起来有效,但您正在访问容器边界之外,即 UB。您需要像这样声明它
std::vector<int> myVector(5)它将分配必要的空间来访问myVector[4]后两者是非法构造 -
语法不正确。箭头运算符为您提供 *objec。结构所以 pToVector->[4] = 0 类似于 *pToVector.[4] = 0. 这条线(pToVector->)[4] 和这条pToVector->[4] 都不起作用
-
您为什么希望它起作用?
a->b表示(*a).b。所以,a->[b]可能意味着(*a).[],这没有任何意义。 -
->[4]根本不符合语法。这!就像:sENTECE? -
请注意,
myVector.[4]也不起作用。
标签: c++ arrays pointers vector dereference