对std::is_standard_layout的困惑:继承类为何不满足标准布局?
标准布局类的条件5解析及代码疑问解答
你提到的代码中,struct A是标准布局,但继承它的struct B却不满足标准布局要求,且已确认条件1-4均符合,核心疑惑点在于条件5的定义。
条件5的准确含义
cppreference中标准布局类的条件5为:
类及其基类的所有非静态数据成员和位域均首次声明于同一类;
这句话的核心意思是:整个继承体系中的所有非静态数据成员(包括所有基类的成员),必须全部是在同一个类中完成首次声明的。简单来说,如果派生类有自己的非静态数据成员,同时它的基类也包含非静态数据成员,那么这些成员分别在基类和派生类中首次声明,就会违反条件5。
代码分析
看你提供的代码:
#include <type_traits> struct A { int a; // 成员a在A中首次声明 }; struct B : A { int b; // 成员b在B中首次声明 }; static_assert(std::is_standard_layout<A>::value, "not standard layout"); // 成功 static_assert(std::is_standard_layout<B>::value, "not standard layout"); // 失败
A的成员a首次声明在A类中,B的成员b首次声明在B类中,整个继承链的非静态数据成员并非都首次声明于同一个类,因此B违反了条件5,导致std::is_standard_layout<B>::value为false,静态断言失败。
让B成为标准布局的可行方案
如果需要B满足标准布局,可以通过以下方式调整:
- 方案1:基类无数据成员
struct A {}; struct B : A { int b; }; static_assert(std::is_standard_layout<B>::value, "not standard layout"); // 断言成功
- 方案2:派生类无数据成员
struct A { int a; }; struct B : A {}; static_assert(std::is_standard_layout<B>::value, "not standard layout"); // 断言成功
- 方案3:所有成员在同一类声明
struct B { int a; int b; }; static_assert(std::is_standard_layout<B>::value, "not standard layout"); // 断言成功
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

