請注意,我正在使用C++ 03,並且delete
d函數沒有提供給我。防止編譯器在C++中考慮隱式聲明的拷貝構造函數03
我試圖設計一個不可複製的對象,並防止編譯器考慮該類上的隱式聲明的複製構造函數。這是我正在開發的單元測試夾具。
請考慮我有兩個主要對象:一個核心庫對象Root
和一個派生的特殊對象測試對象Branch
。我試圖開發一個測試夾具類,Fixture
,它處理與核心Root
對象建立&對象的細節。因此,這是什麼,我到目前爲止已經建立了一個簡單的例證:
(Here is an ideone link與下面的相同的代碼,但我定義我自己noncopyable
)
#include <boost/utility.hpp>
#include <boost/noncopyable.hpp>
class Root
{
};
class Fixture
:
public boost::noncopyable
{
public:
Fixture (Root& root)
:
mRoot (root)
{
}
private:
Root& mRoot;
};
class Branch
:
public Root,
public Fixture
{
public:
Branch()
:
Fixture (*this)
{
}
};
int main()
{
Branch branch;
}
編譯這會導致:
main.cpp: In constructor ‘Branch::Branch()’:
main.cpp:30:23: error: call of overloaded ‘Fixture(Branch&)’ is ambiguous
main.cpp:30:23: note: candidates are:
main.cpp:13:5: note: Fixture::Fixture(Root&)
main.cpp:8:7: note: Fixture::Fixture(const Fixture&)
這是不可能的*,以防止C++ 03編譯器隱含地聲明Fixture
的複製構造函數,除非我自己聲明至少一個。但即使有:
Fixture (*this)
我希望編譯器根本就沒有考慮這些拷貝構造函數:
class Fixture
:
public boost::noncopyable
{
public:
Fixture (Root& root)
:
mRoot (root)
{
}
private:
Fixture (const Fixture&);
Fixture (Fixture&);
Root& mRoot;
};
...編譯器將仍然在Branch
的初始化列表初始化Fixture
時考慮這些private
聲明。
我可以用我自己做一個小的被扭曲做到這一點:
Fixture (static_cast <Root&> (*this))
...但我寧願不要,因爲它是一個有點臭我的鼻子和非複製能力是語義我要去從boost::noncopyable
推導Fixture
。
有沒有一種方法,以防止考慮在這種情況下隱式聲明的拷貝構造函數,編譯器不會在調用點更改代碼:
Fixture (*this)
?
- 「這是不可能的......」:標準C++ 03:12.8/4, 「特殊成員函數」:
如果類定義不明確聲明一個副本 構造函數,一個是隱式聲明的。
C++ 11中刪除的函數甚至有幫助嗎?刪除的函數仍然參與重載解析。 –
@KerrekSB:老實說,我不知道。如果你是對的,他們參與解決,那麼我認爲他們不會幫助。 –
我相信[模板化構造函數](http://ideone.com/nHhzEi)應該明確優先... –