Я испытываю поведение, которое я не понимаю в конструкторе копии производного класса.Завод требует только объявления копии ctor без реализации
class A {
A(const A&);
public:
A() = default;
};
class B : public A {
friend class Factory;
B(const int v) : A(), m_test_val(v) {}
public:
int m_test_val;
B(const B&); // no implementation, just declaration
};
class Factory {
public:
static B create(const int v) {
return B(v);
}
};
int main() {
B b = Factory::create(2);
std::cout << b.m_test_val << '\n';
return 0;
}
поведение я не понимаю, это дело конструктора рабочей копии B::B(const B&);
, которые, однако, не имеет каких-либо реализации.
Вместо этого я получаю сообщение об ошибке, в котором говорится, что я использую удаленную функцию (неявно удаленную из-за плохой формации) в операторе return функции Factory :: create() (A :: A (const A &) является частной и без реализации с целью).
И, конечно, когда я использую B::B(const B&) = delete;
, компилятор говорит мне, что я использую удаленную функцию.
Как возможно, что конструктор копирования работает без реализации только с объявлением?
Примечание: пример кода основан на гораздо большем коде, который ведет себя одинаково, надеюсь, я ничего не оставил.
Это то, что я думал в первую очередь, но оно даже работает с -O0 в g ++ 6.3.1 и в clang 3.9.1. Или уровень оптимизации не имеет значения в этом случае? – ProXicT
Просто попытался скомпилировать с '-fno-elide-constructors' и, наконец, к моему удовлетворению, ссылка не удалась! Спасибо за ключевое слово 'elide'. – ProXicT