私のプログラムで本当に奇妙なバグの原因を探していました。私は不思議なことに、基底クラスのコンストラクタが何らかの理由で呼び出されていないことを発見しました。再現するコードは次のとおりです。基本クラスのコンストラクタは呼び出されませんか?
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.
'のstd :: enable_if_tは'ハードエラーではなく、代替の故障でなければなりません。 –
TartanLlama
本当にあなたは正しいです。私はそれがまだそれなしで起こっているかどうか確認します。 –
コードが未定義の動作を引き起こしませんか? [this](http://stackoverflow.com/questions/40842044/are-checked-guard-parameter-packs-cause-of-ill-formed-programs-in-case-of-specia)と比較してください –