为何所有特殊成员函数私有仍被判定为trivially copyable类?
关于
trivially copyable判定的矛盾问题 以下是相关代码:
#include <iostream> #include <type_traits> class A { A() = default; A(const A&) = default; A(A&&) = default; A& operator=(const A&) = default; A& operator=(A&&) = default; ~A() = default; int a; }; int main() { std::cout << std::boolalpha << std::is_trivially_copy_assignable_v<A> << " " << std::is_trivially_copy_constructible_v<A> << " " << std::is_trivially_move_assignable_v<A> << " " << std::is_trivially_move_constructible_v<A> << " " << std::is_trivially_destructible_v<A> << " " << std::is_trivially_copyable_v<A> << "\n"; return 0; }
运行上述代码,输出为 false false false false false true。
根据cppreference的定义:
平凡可拷贝类(trivially copyable class)是满足以下条件的类:
- 拥有至少一个可用的拷贝构造函数、移动构造函数、拷贝赋值运算符或移动赋值运算符;
- 每个可用的拷贝构造函数都是平凡的;
- 每个可用的移动构造函数都是平凡的;
- 每个可用的拷贝赋值运算符都是平凡的;
- 每个可用的移动赋值运算符都是平凡的;
- 拥有未删除的平凡析构函数。
从输出结果来看,拷贝构造、移动构造、拷贝赋值、移动赋值运算符均非平凡,析构函数也非平凡,但trivially_copyable_v<A>却返回true,这和定义明显矛盾。需要注意的是,即使将~A() = default和A() = default设为public,这个核心问题依然存在。
内容的提问来源于stack exchange,提问作者o_oTurtle
相关产品推荐
相关产品推荐

