2017-02-22 34 views
1

Я испытываю поведение, которое я не понимаю в конструкторе копии производного класса.Завод требует только объявления копии ctor без реализации

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&);, которые, однако, не имеет каких-либо реализации.

Вместо этого я получаю сообщение об ошибке, в котором говорится, что я использую удаленную функцию (неявно удаленную из-за плохой формации) в операторе return функции Factory :: create() (A :: A (const A &) является частной и без реализации с целью).

И, конечно, когда я использую B::B(const B&) = delete;, компилятор говорит мне, что я использую удаленную функцию.

Как возможно, что конструктор копирования работает без реализации только с объявлением?

Примечание: пример кода основан на гораздо большем коде, который ведет себя одинаково, надеюсь, я ничего не оставил.

ответ

2

Фактическая копия завершается компилятором, что разрешено, поскольку конструктор копирования доступен. Компилятор, конечно же, не обязан исключать эту копию, и если бы это было не так, я бы ожидал, что ошибка компоновщика не обнаружит реализацию конструктора копирования.

+0

Это то, что я думал в первую очередь, но оно даже работает с -O0 в g ++ 6.3.1 и в clang 3.9.1. Или уровень оптимизации не имеет значения в этом случае? – ProXicT

+0

Просто попытался скомпилировать с '-fno-elide-constructors' и, наконец, к моему удовлетворению, ссылка не удалась! Спасибо за ключевое слово 'elide'. – ProXicT