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

标签 c++ copy-constructor

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

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/

相关文章:

c++ - 简单线程程序的链接器错误(缺少来自 boost_chrono 的符号)

C++为堆栈类创建复制构造函数

c++ - 复制构造函数的参数

具有复制构造函数的 C++ 对象数组

c++ - 析构函数导致程序崩溃

c++ - 模板和 friend

c++ - 我怎么能只允许 flash activeX 而其他人不允许在我的 webcontrol 中使用 IWebBrowser2?

c++ - 编译器是否将跳过检查移到函数调用之外?

c++ - 使用 push_back 分配内存与构造特定大小的 vector

java - 如何将复制构造函数作为方法引用传递?