為什么msg呼叫后沒有被修改std::move(msg)?
int main()
{
std::string msg( "Error!" );
std::cout << "before try-catch: " << msg << '\n';
try
{
throw std::invalid_argument( std::move( msg ) );
}
catch ( const std::invalid_argument& ia )
{
std::cerr << ia.what( ) << '\n';
}
std::cout << "after try-catch: " << msg << '\n'; // Here I expect to see an empty msg
// like this: after try-catch:
return 0;
}
我想移動msg到 ctorstd::invalid_argument而不是復制它。我認為msg應該修改并在呼叫std::move. 但這會發生:
before try-catch: Error!
Error!
after try-catch: Error!
為什么會這樣?是std::string沒有被呼叫的移動ctor嗎?還是盡管使用了 -O0 選項,但這是某種積極的編譯器優化?
uj5u.com熱心網友回復:
在這里,唯一相關的建構式的std::invalid_argument是:
invalid_argument(const std::string& what_arg);
Const-ref 引數可以系結到任何東西,包括xvalue,即std::move(msg)。std::move()本身只是一個強制轉換,從字串中移出資料的真正作業可以在建構式中完成。但是您不能修改由 const-ref 獲取的xvalue。您唯一的選擇是制作副本,msg不做任何修改。
Cppreference 有以下注釋,它解釋了沒有采用的建構式std::string&&:
由于
std::invalid_argument不允許復制引發例外,因此此訊息通常在內部存盤為單獨分配的參考計數字串。這也是為什么沒有建構式的原因std::string&&:無論如何它都必須復制內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362400.html
上一篇:將堆疊傳遞給函式
