У меня есть иерархия классов, которую можно просто выразить так:
struct Parent {
Parent() { }
Parent(Parent& p, std::string s) { }
private:
// I want this class to be non-copyable
Parent(const Parent&);
};
struct Child : public Parent {
Child() { }
Child(Parent& p) : Parent(p, "hi") { }
};
Когда я пытаюсь создать два экземпляра, подобные этому:
Child c1;
Child c2(c1);
Я получаю следующую ошибку от Clang:
test.cpp:37:8: error: call to deleted constructor of 'Child'
Child c2(c1);
^ ~~
test.cpp:30:8: note: function has been explicitly marked deleted here
struct Child : public Parent {
^
1 error generated.
Я хочу, чтобы этот класс не был копируемым, поэтому есть ли способ вызвать перегрузку Parent&
вместо конструктора копирования? Я знаю, почему он так себя ведет, но я ищу обходной путь. Я хотел бы, чтобы Child(Parent& p)
был вызван без необходимости разыгрывать его.
Я получаю эту ошибку в GCC и Visual Studio. Я не понимаю, что такое с компилятором Intel, но непротиворечивое поведение остальных трех, похоже, указывает на то, что это неправильно, а остальные - правильно.