【问题标题】:Factory requires only declaration of copy ctor without implementation工厂只需要声明复制 ctor 而无需实现
【发布时间】:2017-02-22 17:09:00
【问题描述】:

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

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&amp;); 的问题,但是它没有任何实现。

当我改用 B::B(const B&amp;) = default; 时,我收到一条错误消息,指出我在 Factory::create() 函数的返回语句(A::A (const A&) 是私有的,没有故意实现)。

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

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

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

【问题讨论】:

    标签: c++ copy-constructor


    【解决方案1】:

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

    【讨论】:

    • 这就是我最初的想法,但它甚至可以在 g++ 6.3.1 和 clang 3.9.1 中与 -O0 一起使用。或者在这种情况下优化级别无关紧要?
    • 刚刚尝试使用-fno-elide-constructors 编译,最后,令我满意的是,链接失败!感谢关键字“elide”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多