2015-07-03 31 views
3

我有一個Action類,看起來像這樣(在其精簡形式):對象會從返回的值不構成複製或移動構造

struct Action { 

explicit Action(...some parameters...); // I only use this to construct Action objects 

Action(const Action&) = delete; // Don't want copy constructor 
Action(Action&&) = delete; // Same for move constructor 

} 

在其他一些翻譯單元,我曾嘗試做到這一點:

Action action = someMethodForGettingActions(); // The method returns Action objects by rvalue 

Visual Studio的Intellisense希望爲此掛我,有道理。它說它不能訪問移動構造函數。 然而,這編譯和運行如預期。這裏發生了什麼?這是否是一些編譯器優化對我的玩法?

+0

具體哪一種intellisense解析器?並不是所有的IDE都使用相同的。 –

+0

我使用的是Visual Studio 2013. – Mark

+3

這利用了返回值優化,但編譯器應禁止編譯,因爲您已經刪除了'const Action&'構造函數,即使它實際上並不需要使用它。 – Dave

回答

2

這是一個Return Value Optimization在工作。它實際上被C++ 11標準所允許。檢查的接受的答案:

c++11 Return value optimization or move?

的問題有一點不同,但得到的答覆適合您的問題。

+0

所以編譯器只是公然讓你編譯錯誤的代碼,因爲它知道它會被優化出來?現在RVO真的被認爲是理所當然的嗎? – Mark

+0

如果複製&移動構造函數被明確禁止,編譯器仍然應該拒絕編譯此類代碼。他們沒有實際使用的事實是無關緊要的。嘗試使用GCC編譯相同的代碼。 – Dave

+0

@Dave它看起來(基於該鏈接引用的規範)實現既允許接受代碼,也允許拒絕它,如果它不想爲任何原因執行復制elision(注意「允許省略「)。 –

相關問題