If you look down at what happens, it checks if the assignment operator and ctor exist , . MSVC private std::unique_ptr . . MSVC = delete .., true.
- , , -, ctor:
#include <type_traits>
#include <memory>
template <typename T>
struct wrap
{
T t;
};
template<typename T, typename = int>
struct is_copyable : std::false_type { };
template<typename T>
struct is_copyable<T,
decltype(wrap<T>(std::declval<const wrap<T>&>()), 0)> : std::true_type
{};
class X
{
public:
X(const X&) {}
};
class Y
{
Y(const Y&){}
};
int main()
{
static_assert(is_copyable<std::unique_ptr<int>>::value, "Error!");
static_assert(is_copyable<X>::value, "Error!");
static_assert(is_copyable<Y>::value, "Error!");
}
LWS.
ICE MSVC... .