Обратите внимание, что я работаю в С++ 03, а функции delete
d из С++ 11 недоступны мне.
Я пытаюсь создать объект, не подлежащий копированию, и не позволять компилятору рассматривать неявно объявленный конструктор копирования для этого класса. Это для устройства unit test, которое я разрабатываю.
Учтите, что у меня есть два основных объекта: объект основной библиотеки, Root
и производный объект специального случая под тестом Branch
. Я пытаюсь разработать класс test txt, Fixture
, который обрабатывает мелочи настройки и общения с основным объектом Root
. Итак, это упрощенная иллюстрация того, что я построил до сих пор:
(Вот идеонная ссылка с тем же кодом ниже, за исключением того, что я определил свой собственный 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&)
Невозможно * предотвратить компилятор С++ 03 от неявного объявления конструктора копии для Fixture
, если я не объявлю хотя бы один сам по себе. Но даже с:
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)
?
- "Это невозможно...": Standard С++ 03: 12.8/4, "Специальные функции-члены":
Если определение класса явно не объявляет копию конструктор, один объявлен неявно.