2011-01-19 37 views
2

我的函數聲明爲
siteObject(std::string& url, std::string& get, std::string& post);爲什麼它試圖發送一個char數組而不是一個字符串?

所以爲什麼這site("String 1", "String 2", "String 3");創建一個不匹配類型的錯誤。它說它需要一個字符串引用,並且它正在接收一個char數組。如果您需要更多的細節,請在評論中提問。

+0

長話短說:C設計師作出字符串literaks類型'char []`; C++設計人員使C++與C兼容,併爲包括你在內的所有C++程序員提供了一大堆煩惱,包括這一個。 – delnan 2011-01-19 20:29:00

回答

6

因爲存在對std::string構造函數的隱式調用,該構造函數創建一個臨時對象。你不能對非臨時性的非const引用(因爲修改臨時代碼沒有意義)。

因此,無論是修改您的函數採取const引用或按值,或傳遞它的非臨時對象。

+0

這是唯一的方法嗎? – Will03uk 2011-01-19 20:27:28

+3

這不適用於比MSVC更符合標準的編譯器。既然你想傳遞一個臨時對象作爲非const引用。 – mmmmmmmm 2011-01-19 20:28:15

1

正確的調用是:

std::string url("..."); 
std::string get("..."); 
std::string post("..."); 

siteObject(url, get, post); 

這是有道理的,因爲該方法的簽名意味着你得到的東西早在三根弦(非const引用),你可以使用這些返回值。

如果不是意圖,你必須改變siteObject()方法的能力,那麼你應該做的:

siteObject(std::string const & url, std::string const & get, std::string const & post); 

,並使用你原來的電話。

3

siteObject功能:

siteObject(std::string& url, std::string& get, std::string& post); 

需要字符串對象,其可以不被綁定到右值(或臨時變量)非const引用。

當您嘗試使用字符串文字調用該函數時,編譯器必須將這些參數(即char*)轉換爲與參數類型相匹配的內容 - 該轉換會生成一個臨時的std::string對象。

你需要改變你的函數接受常量引用,如果你希望能夠將它們綁定到臨時對象:

siteObject(std::string const& url, std::string const& get, std::string const& post); 

或者你可以改爲通過參考值:

siteObject(std::string url, std::string get, std::string post); 
1

你需要讓你的函數接受const std::string& str或者構造字符串實例來傳入,而不是依賴char *到字符串對象的隱式轉換。

0

用雙引號字符輸入的字符串來自C++的C遺產(它們被稱爲C字符串或NUL終止字符串)。它們由編譯器實現爲char的數組。相反,std::string是一個C++類,旨在簡化字符串的操作。它擁有一個C字符串(並且可以從一個C字符串創建,因爲它具有接受const char*的構造函數),並管理其內存。

由於存在一個來自const char*std::string的構造函數,並且C字符串與該類型兼容,編譯器如何不能調用此函數?這是因爲該函數對std::string對象採取非const引用。在這種情況下不能使用構造函數,因爲創建的對象將是臨時對象,並且您無法獲得對臨時對象的非常量引用,因爲被調用的函數可能會對其進行變異。

您可以創建std::string,並將它們傳遞給函數:

std::string s1("String 1"); 
std::string s2("String 2"); 
std::string s3("String 3"); 
site(s1, s2, s3); 

或者你也可以改變site函數的原型接受const引用。這是唯一可能的,如果功能不改變的對象,你有權訪問的代碼:

// Declaration 
void site(const std::string& s1, const std::string& s2, const std::string s3); 

// Usage 
site("String 1", "String 2", "String 3"); 
相關問題