[英]Why does std::for_each(from, to, function) return function?
[英]Why does for_each return function by move
我在這里閱讀std::for_each
的文檔http://en.cppreference.com/w/cpp/algorithm/for_each並看到返回值為std::move(f)
為什么標准強制在返回值中移動輸入參數? 默認情況下不會移動它,因為輸入參數是按值傳遞的嗎?
當您編譯以下代碼時,這會引導我進行幾次跟進
Something function(Something something) {
return something;
}
return語句是我的系統上具有最高優化級別( -O3
)的移動,為什么大多數編譯器都不會忽略此返回值? 省略了本地值,但函數參數不是..
在這種情況下C ++ 17是否強制執行? 我閱讀了該提案( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html )但我並不完全了解哪些案例符合強制性省略的條件。
我在我的Mac上的Apple LLVM version 8.0.0 (clang-800.0.42.1)
和Ubuntu 16.04上的g++ 5.4
上嘗試了這個。
這是由於C ++ 11的移動語義規則的最新變化。 當返回子句中出現按值函數參數時, 原始移動提議不會自動移動。 但是在C ++ 11進程的最后階段,添加了該語言功能。
在添加語言功能之前, for_each
“已被移動”。 那時,返回聲明的舉動是必要的。 但是,在C ++ 11出貨的時候,它變得毫無必要。
LWG issue 2747為C ++ 17糾正了此問題 。
關於你的第一個后續問題,我不是編譯器編寫者,但我最好的猜測是:從功能參數(我知道的很多)中忽略返回目前是不合法的,我猜測為什么它不是合法的是,沒有人知道如何實施它,因此沒有人有動力改變標准使其合法化。
第二次跟進:不,C ++ 17在這種情況下不強制執行省略。 在這種情況下,規則與C ++ 11保持相同,除了不再指定從for_each
進行冗余移動的事實。
從下面的評論:
為什么你說從函數參數中退出是不合法的?
我正在引用N4660 ,即C ++ 17,但在C ++ 98/03/11/14備份中有類似的措辭,它最近受到了保護。 請參閱N4659 (同樣好):
15.8.3復制/移動省略[class.copy.elision]
當滿足某些條件時,允許實現省略類對象的復制/移動構造,......
- 在具有類返回類型的函數的
return
語句中,當表達式是非易失性自動對象的名稱(除了函數參數或由處理程序的異常聲明引入的變量(18.3))之外相同類型(忽略cv-qualification)作為函數返回類型,通過將自動對象直接構造到函數調用的返回對象中,可以省略復制/移動操作
這種語言特別禁止從功能參數中省略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.