为何检查类型及元素可复制构造时,std::vector<std::unique_ptr<int>>始终返回true?
问题分析与解决方案
你的核心问题在于判断逻辑的精准度不足,同时可能对std::is_copy_constructible_v的实际行为存在误解:
第一个模板的问题:
std::is_copy_constructible_v<std::vector<std::unique_ptr<int>>>实际值为false——因为std::unique_ptr是移动专属类型,不可复制构造,这会导致std::vector的复制构造函数被显式删除,所以该模板本应返回false。如果你的测试显示返回true,可能是编译器版本兼容问题或代码上下文存在特殊模板特化。第二个concept的问题:
你使用了逻辑或||,意味着满足任意一个条件就返回true。但对于std::vector<std::unique_ptr<int>>,三个条件都不满足(既不是void、自身不可复制构造、元素也不可复制构造),所以该concept本应返回false。若你的测试结果相反,需要检查代码是否存在其他干扰因素。
正确实现逻辑
根据你的需求(检查类型是void,或是可复制构造类型,或是拥有可复制构造元素的容器),以下是精准的concept实现:
#include <type_traits> #include <vector> #include <memory> 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>);
如果你的真实需求是仅当类型是void,或自身可复制构造且其元素类型(若存在)也可复制构造,则逻辑应调整为:
template <typename T> concept VoidOrCopyConstructibleWithValidElements = 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>));
测试验证
- 对于
void:两个concept均返回true - 对于
int:两个concept均返回true - 对于
std::vector<int>:两个concept均返回true - 对于
std::vector<std::unique_ptr<int>>:两个concept均返回false(符合预期)
内容的提问来源于stack exchange,提问作者Trilokesh Pradhan
相关产品推荐
相关产品推荐

