2016-03-17 35 views
2

給定一個功能與一個未使用的(和未命名)的參數:未使用的函數參數是否總是被實例化?

template <typename T> void f(T&&) { /* do something, without using T */ } 

int main() 
{ 
    std::mutex m; 
    f(std::lock_guard<std::mutex> { m }); 
} 

保證要實例化的參數,或者是編譯器允許優化它離開?

+0

有什麼區別? –

+0

構造函數可能有副作用。 – user5434231

+3

@ user5434231:爲示例代碼添加副作用。如果沒有副作用,那麼答案變得太簡單了,因爲as-if規則允許所有優化。 –

回答

4

從[class.temp]:

當實現引入了一個類的臨時對象具有一個非平凡的構造(12.1,12.8),應確保一個構造函數被調用用於臨時對象。

該標準還提供了在[intro.execution]的出:

相反,符合 實現需要模擬(僅)抽象機的可觀察行爲解釋如下 。


這一規定有時被稱爲「爲假設」規則,因爲一個實現免費,只要結果是,如果該要求已經服從於忽略此 國際標準的任何要求,就可以從該程序的可觀察行爲中確定 。例如,一個實際的實現不需要評估表達式 的一部分,如果它能夠推斷出它的值沒有被使用並且沒有產生影響程序可觀察行爲的副作用

當然,獲取鎖定是一種影響可觀察行爲的副作用,所以是的,該參數保證被實例化,因爲它具有可觀察副作用的非平凡構造函數。

+1

除了有as-if規則。 – juanchopanza

相關問題