2016-11-29 11 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); 
}; 

しかし、最初の定義で、親コンストラクタは呼び出されません。 私は親のコンストラクタを削除したとしてとマークしようとしましたが、それでもコンパイルとクラッシュが発生します。

ここで削除されたコンストラクタを持つコードです:私は、コンパイラでの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)と比較してください –

答えて

3

バグを使用してい

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のバージョンをアップグレードした場合。

Microsoft's online compilerバージョン19.10.24631.0(x86)が正しい出力を生成するように見えます。

GCC 6.2.0 and Clang 3.8.0 also appear to produce the correct output

+0

私は2015の最新バージョンを使用しています...私は2017にアップグレードしなければならないようです...あなたの助けに感謝します。 –

関連する問題