![](/img/trans.png)
[英]Why does std::runtime_error::what() return const char* instead of std::string const&
[英]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.