工厂只需要声明复制ctor而不实施

时间:2017-02-22 17:09:00

标签: 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;时,我得到一个错误,说我在Factory :: create()函数的return语句中使用了删除的函数(由于格式错误而被隐式删除) A :: A(const A&amp;)是私有的,没有故意实现。)

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

复制构造函数如何通过声明工作而不执行任何实现?

注意:示例代码基于更大的代码,行为方式相同,希望我没有留下任何东西。

1 个答案:

答案 0 :(得分:2)

编译器会删除实际的副本,因为可以访问复制构造函数,所以允许使用该副本。编译器当然没有义务忽略这个副本,如果没有,我会发现链接器错误没有找到拷贝构造函数的实现。

相关问题