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&);
其中,但是,沒有任何實現的問題。
當我使用B::B(const B&) = default;
相反,我得到一個錯誤,說我使用刪除功能(因爲虐待,形成含蓄刪除)在工廠的return語句::創建()函數(A :: A( const A &)是私有的,並且沒有實現目的)。
當然,當我使用B::B(const B&) = delete;
時,編譯器告訴我我使用了刪除函數。
複製構造函數如何在沒有實現的情況下使用聲明?
注意:示例代碼基於更大的代碼,其行爲方式相同,希望我沒有遺漏任何東西。
這就是我首先想到的,但它甚至可以在g ++ 6.3.1和clang 3.9.1中使用-O0。或者無論在這種情況下優化級別是否? – ProXicT
只是試着用'-fno-elide-constructors'進行編譯,最後讓我滿意,鏈接失敗!感謝關鍵字'elide'。 – ProXicT