[英]C++ operator order evaluation
我有代碼,它給了我一個編譯錯誤。 我期望左右運算符順序評估。 'name += ":"' 的結果是字符串,但看起來它首先評估了 ":" + "O"。 我沒有找到任何明確的解釋。
#include <string>
int main()
{
std::string name("HELL");
name += ":" + "O";
std::cout << "Hello, " << name << "!\n";
}
表達式name += ":" + "O"
分組為name += (":" + "O")
但這將導致編譯錯誤,因為":"
和"0"
是const char[2]
類型,它們會衰減為該表達式中的const char*
指針; 並且指針不能相加!
從 C++14 開始,您可以使用用戶定義的文字""s
將+
置於“字符串模式”:
name += ""s + ":" + "O"
盡管從 運算符優先級和結合性方面考慮很方便,但分組規則已硬連線到語言語法 中。
根據operator precedence , operator+
優先級高於operator+=
,那么name += ":" + "O";
被解釋為name += (":" + "O");
,而":" + "O"
無效,你不能添加兩個指針( ":"
和"O"
會衰減為類型為const char*
指針)。
您可以添加()
來指定優先級,例如(name += ":") + "O";
,它編譯但請注意,部分+ "O"
在這里變得毫無意義。 或者你可能想要(name += ":") += "O";
正如@Scheff 所建議的,這取決於您的需求。
帶有復合賦值的這個表達式語句
name += ":" + "O";
實際上相當於
name = name + ( ":" + "O" );
在這個子表達式中
( ":" + "O" )
字符串文字被轉換為指向它們的第一個元素的指針。 然而,二元運算符 + 沒有為指針定義。 所以編譯器會報錯。
您可以將原始語句拆分為兩個語句,例如
name += ":";
和
name += "O";
在這種情況下,將使用為類 std::basic_string 定義的運算符 + ,該類接受類型為const char *
的參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.