2016-11-29 174 views
3

我正在尋找我程序中一個非常奇怪的錯誤的原因。我奇怪地發現,基類的構造函數不會因爲某種原因而被調用。這裏是重現代碼:未調用基類構造函數?

struct Parent { 
    Parent() : test{9} {} 

    int test; 
}; 

template<typename T> 
struct Child : T { 
    Child() = default; 

    // Will obviously not call this one 
    template<typename... Args, std::enable_if_t<sizeof...(Args) == 9999>* = nullptr> 
    Child(Args&&... args); 
}; 

int main() { 
    Child<Parent> test; 
    std::cout << "This is a test: " << test.test << std::endl; 
} 

在我的情況下,程序只是崩潰或打印隨機值。

如果我改變子類此,調用構造函數:

template<typename T> 
struct Child : T { 
    Child() = default; 
}; 

爲同樣的事情,構造仍稱:

template<typename T> 
struct Child : T { 
    Child() {} 

    // Will obviously not call this one 
    template<typename... Args, std::enable_if_t<sizeof...(Args) == 9999>* = nullptr> 
    Child(Args&&... args); 
}; 

但與第一定義,父構造函數不被調用。 我甚至試圖將父構造器標記爲已刪除,但它仍然編譯並崩潰!

下面是與刪除構造函數的代碼:

struct Parent { 
    Parent() = delete; 

    int test; 
}; 

template<typename T> 
struct Child : T { 
    Child() = default; 

    // Will obviously not call this one 
    template<typename... Args, std::enable_if_t<sizeof...(Args) == 9999>* = nullptr> 
    Child(Args&&... args); 
}; 

int main() { 
    Child<Parent> test; 
    std::cout << "This is a test: " << test.test << std::endl; 
} 

我使用的Visual Studio 2015年更新在編譯器3

+3

'的std :: enable_if_t '應該是一個嚴重的錯誤,而不是一個替代故障。 – TartanLlama

+0

的確你是對的。我會檢查它是否仍然沒有發生。 –

+0

代碼不會導致未定義的行爲嗎?與[this]比較(http://stackoverflow.com/questions/40842044/are-checked-guard-parameter-packs-cause-of-ill-formed-programs-in-case-of-specia) –

回答

相關問題