#include <type_traits>
template <class T>
class Base {
static_assert(!std::is_default_constructible<T>::value,
"T must not be default constructible");
};
struct X1 : Base<X1> {};
struct X2 : Base<X2> {
X2() = default;
};
struct X3 : Base<X3> {
X3() {};
};
struct X4 : Base<X4> {
X4() : Base{} {};
};
struct Y1 {};
int main() {
X1 x1; X2 x2; X3 x3; X4 x4; // all compile. They shouldn't
// all compile. They shouldn't:
Base<X1> bx1; Base<X2> bx2; Base<X3> bx3; Base<X4> bx4;
// Base<Y1> y1; // static assert fires. This is the expected behavior
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIEJhc2UgewogICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICJUIG11c3Qgbm90IGJlIGRlZmF1bHQgY29uc3RydWN0aWJsZSIpOwp9OwoKc3RydWN0IFgxIDogQmFzZTxYMT4ge307CnN0cnVjdCBYMiA6IEJhc2U8WDI+IHsKICAgWDIoKSA9IGRlZmF1bHQ7Cn07CnN0cnVjdCBYMyA6IEJhc2U8WDM+IHsKICAgWDMoKSB7fTsKfTsKc3RydWN0IFg0IDogQmFzZTxYND4gewogICBYNCgpIDogQmFzZXt9IHt9Owp9OwoKc3RydWN0IFkxIHt9OwoKaW50IG1haW4oKSB7CiAgICBYMSB4MTsgWDIgeDI7IFgzIHgzOyBYNCB4NDsgLy8gYWxsIGNvbXBpbGUuIFRoZXkgc2hvdWxkbid0CiAgICAvLyBhbGwgY29tcGlsZS4gVGhleSBzaG91bGRuJ3Q6CiAgICBCYXNlPFgxPiBieDE7IEJhc2U8WDI+IGJ4MjsgQmFzZTxYMz4gYngzOyBCYXNlPFg0PiBieDQ7IAoJLy8gQmFzZTxZMT4geTE7IC8vIHN0YXRpYyBhc3NlcnQgZmlyZXMuIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGJlaGF2aW9yCn0=