[英]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.