2014-07-24 70 views
6

有人向我建議,允許優化器在任何函數中自由交換參數傳遞通過const引用和參數傳遞通過值修改參數。這是C++標準允許的嗎?通過值傳遞參數時保證了複製構造函數調用

或者換句話說,在代碼

struct MyClass { 
    MyClass(MyClass const& mc) { std::cout << "xxx" << std::endl; } 
}; 

void foo(MyClass mc) { } 

MyClass mc; 
foo(mc); 

這是否 「XXX」 是永遠印在C++標準的保證嗎? (參考標準讚賞)

+0

編譯器可以根據代碼的需要生成任何代碼。它不能奇蹟般地忽略諸如打印你的信息之類的東西,除非有明確的許可(並且只發生在一種情況下,這是複製瑕疵,並且不適用於你的情況)。 –

+0

除非它是基本的數據類型,否則你的函數可能會修改裏面的值,我總是將const ref作爲「default」傳遞。這只是我個人的意見。 –

回答

8

是的,複製構造函數將在這裏使用。複製省略只允許在某些情況下,由C++ 11 12.8/31規定:

  • return聲明......在拋表達
  • ...
  • 當臨時類對象......會被拷貝/移動...
  • 當一個異常處理的異常聲明聲明相同類型的對象......作爲異常對象

這些都不適用於這裏,但如果你通過一個臨時的三次將適用:

foo(MyClass()); 

在這種情況下可能無法打印該消息。此外,如果複製構造函數沒有副作用,那麼在任何情況下(無論參數是否是臨時的),複製都可以在「as-if」規則下消失,因爲這樣做不會影響程序的可見行爲。

+0

你的意思是在'foo(MyClass());'編譯器不必打印消息?那麼最後一句中的if-從句就會誤導人。至少,這就是我理解第3點的原因。 –

+0

@TobiasBrüll:是的,如果參數是臨時的,則應用點3,因此消息可能不會被打印。無論如何,如果沒有副作用(但沒有,如在你的例子中),最後一句話將適用;對不起,如果你發現它的誤導,我會嘗試找到一個更好的措辭措辭。 –

相關問題