簡體   English   中英

為什么for_each通過移動返回功能

[英]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;
} 
  1. return語句是我的系統上具有最高優化級別( -O3 )的移動,為什么大多數編譯器都不會忽略此返回值? 省略了本地值,但函數參數不是..

  2. 在這種情況下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]

  1. 當滿足某些條件時,允許實現省略類對象的復制/移動構造,......

    • 在具有類返回類型的函數的return語句中,當表達式是非易失性自動對象的名稱(除了函數參數或由處理程序異常聲明引入的變量(18.3))之外相同類型(忽略cv-qualification)作為函數返回類型,通過將自動對象直接構造到函數調用的返回對象中,可以省略復制/移動操作

這種語言特別禁止從功能參數中省略。

暫無
暫無

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

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