例如:可以std :: move()或它的顯式等價於本地變量allow elision?
Big create()
{
Big x;
return std::move(x);
// return static_cast<typename std::remove_reference<T>::type&&>(t) // why not elide here?
}
假設應用std::move()
返回一個局部變量抑制移動的語義,因爲編譯器不能做出的一般功能的內部工作,有關情況下,當這些假設是什麼做任何假設沒有必要的,例如當:
std::move(x)
內聯(可能永遠)std::move(x)
寫爲:static_cast<typename std::remove_reference<T>::type&&>(t)
根據目前的標準,實現允許應用NRVO ...
- return語句中與類返回類型,一種功能,當 表達的名稱將與 (忽略cv-qualification)相同類型的非易失性自動對象( 函數參數或由 異常聲明處理程序(18.3)引入的變量)作爲函數返回類型,副本/移動 操作可以通過構造auto來省略matic對象直接撥入函數調用的返回對象
顯然,1)和2)都不具備資格。除了使用std::move()
返回本地變量的事實是多餘的,爲什麼是必要的限制?
類似std :: move()的轉換是在編譯時執行的,所以elision是沒有意義的;它們只是編譯器改變如何看待類型的指示。 –
[在返回的對象上使用'std :: move()'是多餘的。](https://stackoverflow.com/a/14856553/501250) – cdhowie
「假設本地變量上的std :: move()移動語義等因素等「 - 聽起來不對。 – einpoklum