template <typename T>
constexpr bool isVoidOrCopyConstructible = std::is_void_v<T> || std::is_copy_constructible_v<T>;
这对于
std::vector<std::unique_ptr<int>>
返回 true。
我将支票更改为:
template <typename T>
concept VoidOrEffectivelyCopyConstructible =
std::is_void_v<T> ||
std::is_copy_constructible_v<T> ||
(requires { typename T::value_type; } && std::is_copy_constructible_v<typename T::value_type>);
它仍然返回 true
std::vector<std::unique_ptr<int>>
。
您需要检查非容器类型或包含类型的
std::is_copy_constructible_v
,而不是无条件检查std::is_copy_constructible_v
。
template <typename T>
concept VoidOrEffectivelyCopyConstructible =
std::is_void_v<T> ||
(std::is_copy_constructible_v<T> && !requires { typename T::value_type; }) ||
std::is_copy_constructible_v<typename T::value_type>;