2016-10-05 21 views
7

假設有這樣的功能,移動:的std :: MOVE-如何警告程序員不使用* *從對象

int * func() 
{ 
    std::unique_ptr<int> ptr(new int(3)); 
    //Few more lines of code 

    //then one function added where programmer writes like some thing 

    SOME_OTHER_FUNC(std::move(ptr)); 

    return ptr.get(); 
} 



void SOME_OTHER_FUNC(std::unique_ptr<int> arg_ptr) 
{ 
} 

有沒有一種方法來提醒程序員,以避免與std::move這樣的錯誤?這不僅僅是關於unique_ptr,而是其他對象。

當我們使用移動從不合適的對象對象是否有任何機制來產生警告?

+0

不知道是否重複,但密切主題明智:http://stackoverflow.com/questions/39413502/why-should-a-move-constructor-or-move-assignment-operator-clear-its-argument/39413587# 39413587 – Hayt

+1

我希望編譯器編寫者發明警告,以便使用任何已經轉換爲右值的任何東西,例如'std :: move'。如果它足夠傷害你,考慮向你的編譯器的作者提交補丁! –

+0

@TobySpeight我懷疑會引入這樣的警告。類型可以有移動構造函數/賦值運算符,使原始文件處於(部分,甚至完全)指定狀態,並且某些(甚至可能全部)某些操作將具有明確定義的行爲。編譯器如何知道從對象移出的使用是否是無意的? – user2079303

回答

15

std::move的警告。如果你的程序員不理解這一點,你必須更好地教育他們。如果這個函數太長以至於程序員可以合理地忽略這個移動,你需要重構你的函數來縮短它。

+2

或者,將'move''的範圍限制在變量的範圍內,所以它的生命週期和開始位置就在它的移動位置旁邊。 – Yakk

+1

「*'std :: move'是警告。*」有人說,委員會經歷了很大的麻煩,迫使你使用std :: move來確保它清楚給每個讀取對象已被移出的代碼的人。有些人仍然不明白。 –

+1

@NicolBolas大家都知道'std :: move'不會移動,'std :: forward'不會轉發。 – Yakk

0

並非所有問題都可以或應該在源代碼中解決。

  1. 使用unique_ptr是一個實現細節;封裝它。

  2. 指定功能和使用測試的前置和後置條件。

+3

不是每個問題都可以通過抽象來解決。事實上,您的資源可以從後來變爲無效並且無法通過抽象來解決。完美的測試和測試覆蓋率以與編寫完美代碼解決所有問題相同的方式解決了所有問題。更完美的測試和更完美的代碼使事情變得更好,但是說「編寫測試來覆蓋它」與「首先不要做這件事」一樣有用。 – Yakk

+0

您錯過了事前和事後條件。 – knivil

0

這將是很好的編譯器幫助,不是嗎?有充分的理由它並不像你想象的那麼簡單:

  1. std::move()不是魔術,你可以寫你自己的類似的功能。編譯器如何知道你的新函數必須以同樣的方式處理?你需要一個標準屬性來修飾這個函數。如果您針對確切功能std::move進行了特定警告,則可將標準庫的知識編碼到語言編譯器1中。
  2. 雖然一般,一個移動的對象只能被分配給或者被破壞,但某些類可以對移動的狀態提供更強的保證(例如,一個容器可以被記錄爲當有效的空集合時從)移動)。你怎麼能告訴編譯器哪些操作在這樣的特定移動對象上是安全的?

¹反駁:編譯器已經這樣做了,當然類似的東西,驗證格式字符串std::printf()std::scanf()家庭的功能時。

相關問題