[英]Why does dereferencing a string vector iterator need parentheses?
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();
以便它可以被正确解释 - 您打算解释它的方式。
看一下:
如果没有括号,您将尝试取消引用整个语句ItStr.c_str()
。
使用*ItStr
周围的括号,您将取消引用ItStr
,然后获取它的.c_str()
成员。 箭头运算符->
也可以用来代替在取消引用的ItStr
周围放置括号。
正如 James 等人所指出的,这是一个运算符优先级问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.