作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在派生类的复制构造函数中遇到了我不理解的行为。
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;
时,我收到一条错误消息,提示我在 return 语句中使用了已删除的函数(由于格式错误而隐式删除) Factory::create() 函数(A::A(const A&) 是私有(private)的,没有故意实现)。
当然,当我使用 B::B(const B&) = delete;
时,编译器告诉我我使用了 deleted 函数。
复制构造函数怎么可能在没有实现的情况下仅通过声明工作?
注意:示例代码基于行为相同的更大代码,希望我没有遗漏任何内容。
最佳答案
编译器忽略了实际的拷贝,这是允许的,因为复制构造函数是可访问的。编译器当然没有义务删除此拷贝,如果没有删除,我预计会出现链接器错误,找不到复制构造函数的实现。
关于c++ - 工厂只需要声明 copy ctor 而无需实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42397983/
我是一名优秀的程序员,十分优秀!