为何并非所有P2786平凡可重定位类型都是隐式生存期类型?
关于C++隐式生存期类型与平凡可重定位类型的标准疑问
请看以下代码:
#include <type_traits> struct A trivially_relocatable_if_eligible final { A() {} A(A const&) = delete; A& operator=(A const&) = delete; ~A() {} }; static_assert(std::is_implicit_lifetime_v<A>); // clang-21.1.0-rc2中判定为true
根据最新C++标准n5008(11.2/p16 [class.prop]):
类S是隐式生存期类,当且仅当:
- (16.1) 它是析构函数非用户提供的聚合类,或者
- (16.2) 它至少有一个平凡的可行构造函数,且拥有平凡、未删除的析构函数。
按照标准定义,std::is_implicit_lifetime_v<A>的值应为false——类A既不满足(16.1)的条件,也不满足(16.2):它没有平凡的可行构造函数,因此不属于隐式生存期类型。但clang-21.1.0-rc2中该断言却能通过,将其判定为隐式生存期类型。
需要注意的是,在某些场景下,执行平凡重定位后必须调用std::start_lifetime_as,而该函数要求相关类型必须是隐式生存期类型。因此我认为平凡可重定位类型和可替换类型都应被定义为隐式生存期类型(就像clang的实现那样),但C++标准似乎并未作出此规定。
请问这是C++标准的疏漏,还是我的理解有误?
¹ std::start_lifetime_as要求相关类型必须是隐式生存期类型。
² 参考提案p2786r13
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

