2017-10-16 144 views
2

我一直在瀏覽一段時間尋找答案,但我似乎沒有找到答案。所以我決定在這裏專門提出這個問題。在班級成員中移動右值

我一直在嘗試使用這樣的(並作爲本發明的變體):

struct NonCopyable 
{ 
    NonCopyable() { }; 
    NonCopyable(const NonCopyable& other) = delete; 
    NonCopyable(NonCopyable&& other) { }; 
}; 

struct Host 
{ 
    Host(NonCopyable&& nc) : m_nc(nc) { } 
    NonCopyable m_nc; 
}; 

來實現這一目標:

Host h(NonCopyable()); 

換句話說,我想構建不可複製的內部m_nc。這是可能嗎?

+0

如果你想在'm_nc'中構建'NonCopyable',那麼你爲什麼要傳遞它作爲參數(而不是在'm_nc'中構造它?...) – user463035818

+0

我想注入它外。你的意思是我應該只傳遞它的構造函數的參數並且在主機內部構造它?像:'Host():m_nc()'? – racanu

+0

關於[方法定義之後的分號]的一些說明(https://stackoverflow.com/a/5365656/211160)。 – HostileFork

回答

4

請注意,nc是一個左值作爲命名參數,您需要將其轉換爲右值,例如,通過std::move

Host(NonCopyable&& nc) : m_nc(std::move(nc)) { } 

編輯

有一個most vexing parse問題。 Host h(NonCopyable());不是一個變量定義,而是一個函數聲明;它聲明瞭一個名爲h的函數,它返回Host並帶有一個帶有函數指針類型的無名參數(它不需要任何東西並返回NonCopyable)。

只需將其更改爲Host h{NonCopyable()};即可。

+0

是的,也試過了。不想這樣發佈,不會影響答案。 – racanu

+1

@racanu你試過了,那有什麼困難?是什麼讓你覺得這是不可能的? – songyuanyao

+0

我的意思是即使使用std :: move,它也不會像我喜歡的那樣工作。它編譯但我得到一個警告: '警告C4930:「主機H(不可複製(__cdecl *)(無效))」:原型函數不叫(?是一個變量定義意)' 而且也沒有對生成的代碼實例化行。 – racanu