我遇到的行为是我在派生类的副本构造函数中无法理解的。
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&);
的问题,然而,它没有任何实现。
当我使用B::B(const B&) = default;
时,我得到一个错误,说我在Factory :: create()函数的return语句中使用了删除的函数(由于格式错误而被隐式删除) A :: A(const A&amp;)是私有的,没有故意实现。)
当然,当我使用B::B(const B&) = delete;
时,编译器告诉我我使用了删除的函数。
复制构造函数如何通过声明工作而不执行任何实现?
注意:示例代码基于更大的代码,行为方式相同,希望我没有留下任何东西。
答案 0 :(得分:2)
编译器会删除实际的副本,因为可以访问复制构造函数,所以允许使用该副本。编译器当然没有义务忽略这个副本,如果没有,我会发现链接器错误没有找到拷贝构造函数的实现。