为什么解引用字符串向量迭代器需要括号?

时间:2011-07-21 17:28:02

标签: c++ oop vector iterator

vector<string> MyStrings;
vector<string>::iterator ItStr;

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

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

不编译:{{1​​}}

  

错误C2039:'c_str':不是'std :: vector&lt; _Ty&gt; :: iterator'

的成员

使用迭代器周围的括号编译/使用:*ItStr.c_str();

如果你能指出我(没有双关语),我会很感激。谢谢!

4 个答案:

答案 0 :(得分:12)

.的优先级高于一元*

*ItStr.c_str()就好像你曾说过*(ItStr.c_str())

当然,您可以使用ItStr->c_str(),因为(*x).y等同于x->y(至少对于指针和迭代器;当然,您可以为您的运算符重载他们自己的类型不一致,但你这样做会很疯狂。)

答案 1 :(得分:5)

因为.运算符优先于*运算符。见this link

答案 2 :(得分:4)

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

*(ItStr.c_str());

这显然是错误的,你可能并不打算这样做。它以这种方式解释,因为.运算符的优先级高于*运算符。为避免这种情况,您需要在此处使用括号:

(*ItStr).c_str();

这样就可以正确解释它 - 你打算如何解释它。

看看:

答案 3 :(得分:2)

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

对于*ItStr周围的问题,您将取消引用ItStr,然后转移.c_str()成员。也可以使用箭头操作符->代替将括号括在解除引用的ItStr周围。

正如詹姆斯等人指出的那样,这是一个运营商优先问题。