一次編譯錯誤引發的對 C++ 賦值語句右值語義的思考。記錄錯誤代碼、編報錯誤信息、正確寫法,並延伸到靜態成員初始化的統一模式。
vectorblankVector() { return vector blankVector; // 錯誤:試圖在 return 語句中聲明變量 }
編譯錯誤:
error: expected primary-expression before 'blankVector' error: expected ';' before 'blankVector'
return 後期望的是一個表達式(產生右值對象),而 vector 是一條聲明語句,不產生值。編譯器在解析 return 運算元時,遇到類型名 vector 後期望構造函數調用或標識符,而非變量定義。
vectorblankVector() { return vector (); // 匿名臨時對象,移動語義/複製省略優化 }
vector 顯式構造一個無名臨時對象(prvalue),作為返回值初始化調用方的對象(C++17 保證複製省略,更早版本依賴 RVO/移動構造)。
// A.h
class A {
static map mss;
};
// A.cpp
map A::mss = map(); // 臨時對象初始化靜態成員
同理,map 生成臨時對象,用於拷貝/移動初始化靜態存儲期的 mss。
Type() 是構造值初始化臨時對象的標準寫法,適用於返回值、參數傳遞、成員初始化列表、靜態成員定義等所有需要右值的場景。return Type() 直接構造於調用方存儲),零開銷。細節決定質量。理解「聲明 vs 表達式」「左值 vs 右值」是寫出高效、正確 C++ 代碼的基石。