#include <vector>
#include <memory>
template<typename T>
class V {
public:
template<typename U = T, std::enable_if_t<std::is_copy_assignable_v<U>, int> = 0>
auto operator = (const V &rhs) -> V & { v = rhs.v; return *this; }
private:
std::vector<T> v;
};
template<typename T>
class U {
public:
template<typename U = T, std::enable_if_t<std::is_copy_assignable_v<U>, int> = 0>
auto operator = (const U &rhs) -> U & { t = rhs.t; return *this; }
private:
T t;
};
int main()
{
static_assert(!std::is_copy_assignable_v<std::unique_ptr<int>>); // success
static_assert(!std::is_copy_assignable_v<U<std::unique_ptr<int>>>); // success
static_assert(!std::is_copy_assignable_v<V<std::unique_ptr<int>>>); // fail
return 0;
}
Here, U<T>
and V<T>
have assignment operator when T
is copy-assignable.
However, static_assert
to check if V<std::unique_ptr<int>>
is non-copy-assignable fails although similar check for U<std::unique_ptr<int>>
successes.
Why does the static_assert
fail for V<T>
here and how can I fix it?