#include <utility>
template<typename T>
union _impl_itca_helper { T dummy; };
template<typename T>
std::true_type _impl_itca (T, int,
decltype (
(std::declval<_impl_itca_helper<T>> () = std::declval<_impl_itca_helper<T>> ()),
int { }
) = 0
);
template<typename T, typename U>
std::false_type _impl_itca (T, U);
template<typename T>
using is_trivially_copy_assignable = decltype (
_impl_itca (std::declval<T> (), int { })
);
int
main (int argc, char *argv[])
{
struct Obj1 { Obj1& operator= (Obj1 const&) = default; };
struct Obj2 { Obj1& operator= (Obj2 const&); };
static_assert (
is_trivially_copy_assignable<Obj1>::value,
"Obj1 is not trivially copy assignable"
);
static_assert (
is_trivially_copy_assignable<Obj2>::value,
"Obj2 is not trivially copy assignable"
);
}
I2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp1bmlvbiBfaW1wbF9pdGNhX2hlbHBlciB7IFQgZHVtbXk7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdGQ6OnRydWVfdHlwZSBfaW1wbF9pdGNhIChULCBpbnQsCiAgZGVjbHR5cGUgKAogICAgKHN0ZDo6ZGVjbHZhbDxfaW1wbF9pdGNhX2hlbHBlcjxUPj4gKCkgPSBzdGQ6OmRlY2x2YWw8X2ltcGxfaXRjYV9oZWxwZXI8VD4+ICgpKSwKICAgIGludCB7IH0KICApID0gMAopOwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4Kc3RkOjpmYWxzZV90eXBlIF9pbXBsX2l0Y2EgKFQsIFUpOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZSA9IGRlY2x0eXBlICgKICBfaW1wbF9pdGNhIChzdGQ6OmRlY2x2YWw8VD4gKCksIGludCB7IH0pCik7CgppbnQKbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogIHN0cnVjdCBPYmoxIHsgT2JqMSYgb3BlcmF0b3I9IChPYmoxIGNvbnN0JikgPSBkZWZhdWx0OyB9OwogIHN0cnVjdCBPYmoyIHsgT2JqMSYgb3BlcmF0b3I9IChPYmoyIGNvbnN0Jik7IH07CgogIHN0YXRpY19hc3NlcnQgKAogICAgaXNfdHJpdmlhbGx5X2NvcHlfYXNzaWduYWJsZTxPYmoxPjo6dmFsdWUsCiAgICAiT2JqMSBpcyBub3QgdHJpdmlhbGx5IGNvcHkgYXNzaWduYWJsZSIKICApOwoKICBzdGF0aWNfYXNzZXJ0ICgKICAgIGlzX3RyaXZpYWxseV9jb3B5X2Fzc2lnbmFibGU8T2JqMj46OnZhbHVlLAogICAgIk9iajIgaXMgbm90IHRyaXZpYWxseSBjb3B5IGFzc2lnbmFibGUiCiAgKTsKfQo=