为什么解引用string vector迭代器需要括号

Why does dereferencing a string vector iterator need parentheses?

本文关键字:迭代器 vector 引用 string 为什么      更新时间:2023-10-16
vector<string> MyStrings;
vector<string>::iterator ItStr;

我使用c_str()返回指向字符串的指针。

为什么需要用圆括号取消引用?

不编译:*ItStr.c_str();

错误C2039: 'c_str':不是'std::vector<_Ty>::iterator'的成员

编译/使用圆括号括起迭代器:(*ItStr).c_str();

如果你能给我指出正确的方向(没有双关语),我会很感激的。

.优先级高于一元*

*ItStr.c_str()就像你说的*(ItStr.c_str())

当然,你可以只使用ItStr->c_str(),因为(*x).y相当于x->y(至少对于指针和迭代器;当然,您可以为自己的类型重载操作符,使它们不一致,但这样做是疯狂的)。

因为.运算符优先于*运算符。查看此链接

如果没有括号,*ItStr.c_str();将被解释为:

*(ItStr.c_str());

显然是错误的,而且你可能不是故意的。这样解释是因为.运算符的优先级高于*运算符。为了避免这种情况,你需要在这里使用括号:

(*ItStr).c_str();

这样它就可以被正确地解释——按照你想要的方式来解释。

看一下:

  • c++运算符优先表

如果没有括号,您将试图解引用整个语句ItStr.c_str()

对于*ItStr周围的父元素,您将解引用ItStr,然后取其.c_str()成员。箭头操作符->也可以用来代替在取消引用的ItStr周围放圆括号。

正如James等人所指出的,这是一个操作符优先级问题。