【问题标题】:Why does dereferencing a string vector iterator need parentheses?为什么解引用字符串向量迭代器需要括号?
【发布时间】:2011-10-10 10:39:28
【问题描述】:
vector<string> MyStrings;
vector<string>::iterator ItStr;

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

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

无法编译:*ItStr.c_str();

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

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

如果您能指出我(不是双关语)正确的方向,我将不胜感激。谢谢!

【问题讨论】:

  • () 通常称为括号brackets 通常指的是[](而{} 通常指的是moustaches;呃,我的意思是braces)。
  • 用“括号”修复了问题

标签: c++ oop vector iterator


【解决方案1】:

. 的优先级高于一元 *

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

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

【讨论】:

  • 严格来说,我选择你的答案是因为你把“{}”称为小胡子。
【解决方案2】:

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

使用*ItStr 周围的括号,您将取消对ItStr 的引用,然后使用它的.c_str() 成员。箭头运算符-&gt; 也可以用来代替在取消引用的ItStr 周围放置括号。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      *(ItStr.c_str());
      

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

      (*ItStr).c_str();
      

      这样它就可以被正确地解释——你希望它被解释的方式。

      看看:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-22
        • 2017-02-19
        • 2018-03-19
        • 2019-08-13
        • 1970-01-01
        • 2014-08-09
        • 2023-02-26
        • 2021-06-06
        相关资源
        最近更新 更多