#include <iostream>
struct A {
A(){}
A(const A &){ std::cout << "IN A" << std::endl; }
};
struct B : public A{
template<typename ...Args,
typename = typename std::enable_if
<
std::is_constructible<A, Args...>::value
>::type>
B(Args &&...args)
: A(std::forward<Args>(args)...) {}
};
template<>
inline B::B(const A &a):A(a){ std::cout << "IN B-A" << std::endl; }
template<>
inline B::B(const B &b):A(b){ std::cout << "IN B-B" << std::endl; }
int main(){
A a;
B b(a);
B b1(b);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgQSB7CiAgQSgpe30KICBBKGNvbnN0IEEgJil7IHN0ZDo6Y291dCA8PCAiSU4gQSIgPDwgc3RkOjplbmRsOyB9Cn07CgpzdHJ1Y3QgQiA6IHB1YmxpYyBBewogIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsCiAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmCiAgICAgIDwKICAgICAgICBzdGQ6OmlzX2NvbnN0cnVjdGlibGU8QSwgQXJncy4uLj46OnZhbHVlCiAgICAgID46OnR5cGU+CiAgICBCKEFyZ3MgJiYuLi5hcmdzKQogICAgIDogQShzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIHt9Cn07CnRlbXBsYXRlPD4KaW5saW5lIEI6OkIoY29uc3QgQSAmYSk6QShhKXsgc3RkOjpjb3V0IDw8ICJJTiBCLUEiIDw8IHN0ZDo6ZW5kbDsgfQp0ZW1wbGF0ZTw+ICAKaW5saW5lIEI6OkIoY29uc3QgQiAmYik6QShiKXsgc3RkOjpjb3V0IDw8ICJJTiBCLUIiIDw8IHN0ZDo6ZW5kbDsgfQoKaW50IG1haW4oKXsKICBBIGE7CiAgQiBiKGEpOwogIEIgYjEoYik7CiAgcmV0dXJuIDA7Cn0=