为什么解引用string vector迭代器需要括号
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();
这样它就可以被正确地解释——按照你想要的方式来解释。
看一下:
- c++运算符优先表
如果没有括号,您将试图解引用整个语句ItStr.c_str()
。
对于*ItStr
周围的父元素,您将解引用ItStr
,然后取其.c_str()
成员。箭头操作符->
也可以用来代替在取消引用的ItStr
周围放圆括号。
正如James等人所指出的,这是一个操作符优先级问题。
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 修改 std::vector 会使迭代器无效吗?
- 计算两个迭代器之间的距离时"Vector Iterators Incompatible"
- 从 std::vector 迭代器中执行函数指针
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- std::vector::erase() 真的会在擦除时使迭代器失效吗?
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- C++ std::vector语言 - 如何修改迭代器指定的元素?
- 迭代器返回 vector::begin()
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- c std :: vector迭代器构造函数,first == last
- C++迭代器作为 lambda 函数中的参数,断言失败:"vector iterators incompatible"
- 在类 std::vector 中使用迭代器
- 为什么 std::vector 迭代器在 erase() 调用后失效?
- 为每个循环中的std :: vector的当前元素分配迭代器
- 使用正向迭代器反向迭代 std::vector
- 英特尔检查器 XE 2012 警告 #12367 - 将迭代器参数切片传递给 vector::erase()
- 迭代器 - vector::itrator 和 array::iterator 的重载函数
- 向量迭代器 > vector.end() 即使向量不应该被重新分配