工厂只需要声明 copy ctor 而无需实现

Factory requires only declaration of copy ctor without implementation

我在派生的复制构造函数中遇到了我不理解的行为 class。

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&) 是私有的,没有故意实现)。

当然,当我使用 B::B(const B&) = delete; 时,编译器告诉我我使用了已删除的函数。

复制构造函数怎么可能只通过声明就可以在没有实现的情况下工作?

注意:示例代码基于更大的代码,但行为方式相同,希望我没有遗漏任何内容。

编译器忽略了实际的副本,这是允许的,因为复制构造函数是可访问的。编译器当然没有义务省略这个副本,如果没有,我会期望链接器错误找不到复制构造函数的实现。