簡體   English   中英

std::string const& 參數是否復制傳遞的 const char*?

[英]Does std::string const& parameter copies the passed const char*?

抱歉,如果這是一個非常菜鳥的問題。 我需要知道 c++ 是否已經支持以下行為:

void sampleFunc(std::string const& p_sVal){
    
    Log("this is your string: " + p_sVal);

}

int main(){
    
    sampleFunc("my string");   //does the param allocates a copy of "my string"...?
    
}

參數std::string const& p_sVal分配了傳遞的const char*的副本,或者編譯器足夠聰明,知道傳遞的是const char*並且可以優化它不需要分配和復制?

如果沒有,您能否建議實現此目的的示例代碼? (注意:除了string_view解決方案。)

從傳遞給它的字符串文字構造一個臨時的std::string ,供std::string const&參數引用。

正如評論中所建議的, std::string擁有它的存儲空間(否則它將是std::string_view ,不是嗎?)。 在我看來,僅此觀察並不能真正告訴您臨時std::string無法從傳遞的參數中竊取資源。

資源仍然可以移動,因為您將右值傳遞給sampleFun ,對嗎? 不,錯,因為正如您在此處看到的,文字字符串(例如main中的"my string" )是左值,而不是右值。

哦,即使字符串文字是右值,從關於std::string (好吧, std::basic_string )構造函數的文檔中,您會看到除了“移動構造函數”之外,沒有其他構造函數采用&& (即復制構造函數的移動版本,即一個構造函數,它采用與它正在構造的類型相同的類型,即std::string ,而不是const char* )。

請注意,由於您正在執行"this is your string: " + p_sVal ,因此您確實希望在某個時候構造一個std::string ,因為您需要std::operator+才能工作。 您可以通過const char*獲取sampleFunc ,但是您必須將p_sVal或字符串文字包裝在std::string{…}中才能使+起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM