如何通过std::vector判断其存储对象是否为平凡可复制类型?
解决方法
有两种简洁的方式可以通过v来实现正确的类型判断:
方法一:利用vector的value_type成员类型
std::vector本身定义了value_type成员,直接对应容器存储的元素类型,这是最规范的做法:
#include <vector> #include <type_traits> class A { }; int main() { std::vector<A> v; static_assert(std::is_trivially_copyable<typename decltype(v)::value_type>::value); return 0; }
这里typename decltype(v)::value_type会推导出A,完美匹配需求。
方法二:用std::remove_reference_t移除引用修饰
既然decltype(v[0])得到的是A&,可以通过类型萃取工具std::remove_reference_t去掉引用,得到原始的元素类型:
#include <vector> #include <type_traits> class A { }; int main() { std::vector<A> v; static_assert(std::is_trivially_copyable<std::remove_reference_t<decltype(v[0])>>::value); return 0; }
std::remove_reference_t<decltype(v[0])>会把A&转换成A,让断言条件成立。
补充说明
原代码断言失败的核心原因是:std::vector::operator[]返回的是元素的引用(A&),而std::is_trivially_copyable对引用类型的判断结果为false(因为引用不是对象,不满足可平凡复制的对象要求);而直接用A时,A是无自定义特殊成员函数的平凡类型,满足is_trivially_copyable的条件。
内容的提问来源于stack exchange,提问作者user3749105
相关产品推荐
相关产品推荐

