2017-02-22 28 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&);其中,但是,沒有任何實現的問題。

當我使用B::B(const B&) = default;相反,我得到一個錯誤,說我使用刪除功能(因爲虐待,形成含蓄刪除)在工廠的return語句::創建()函數(A :: A( const A &)是私有的,並且沒有實現目的)。

當然,當我使用B::B(const B&) = delete;時,編譯器告訴我我使用了刪除函數。

複製構造函數如何在沒有實現的情況下使用聲明?

注意:示例代碼基於更大的代碼,其行爲方式相同,希望我沒有遺漏任何東西。

回答

2

實際副本被編譯器忽略,由於可以訪問副本構造函數,所以允許使用該副本。編譯器當然沒有義務刪除這個副本,如果沒有,我會希望鏈接器錯誤沒有找到複製構造函數的實現。

+0

這就是我首先想到的,但它甚至可以在g ++ 6.3.1和clang 3.9.1中使用-O0。或者無論在這種情況下優化級別是否? – ProXicT

+0

只是試着用'-fno-elide-constructors'進行編譯,最後讓我滿意,鏈接失敗!感謝關鍵字'elide'。 – ProXicT

相關問題