请注意,我在 C++03 中工作,而delete
C++11 的 d 函数对我不可用。
我正在尝试设计一个不可复制的对象,并阻止编译器考虑该类上隐式声明的复制构造函数。这是我正在开发的单元测试夹具。
考虑一下我有两个主要对象:一个核心库对象Root
和一个在测试中的派生特例对象Branch
. 我正在尝试开发一个测试夹具类,Fixture
它处理设置和与核心Root
对象交谈的细节。所以这是我到目前为止所构建内容的简化说明:
(这是一个ideone链接,下面有相同的代码,除了我定义了我自己的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&)
Fixture
除非我自己声明至少一个,否则不可能*阻止 C++03 编译器隐式声明一个复制构造函数。但即使有:
class Fixture
:
public boost::noncopyable
{
public:
Fixture (Root& root)
:
mRoot (root)
{
}
private:
Fixture (const Fixture&);
Fixture (Fixture&);
Root& mRoot;
};
...在的初始化列表中初始化时,编译器仍会考虑这些private
声明:Fixture
Branch
Fixture (*this)
我希望编译器根本不考虑这些复制构造函数。
我可以通过自己做一些扭曲来做到这一点:
Fixture (static_cast <Root&> (*this))
...但我宁愿不这样做,因为它对我的鼻子来说有点臭,而且不可复制能力是我Fixture
从boost::noncopyable
.
在这种情况下,有没有办法阻止编译器考虑隐式声明的复制构造函数,而无需更改调用站点的代码:
Fixture (*this)
?
- “不可能……”:标准 C++03:12.8/4,“特殊成员函数”:
如果类定义没有显式声明复制构造函数,则隐式声明。