【发布时间】:2021-10-18 11:39:43
【问题描述】:
我的理解是,没有任何虚拟方法是标准布局的要求之一。但是,当 struct Cancel 中有一个虚方法时,以下代码会打印出 true。
如果我删除虚拟方法。 is_stand_layout 返回 false 这是有道理的,因为 Cancel 的成员具有不同的访问控制。
我在gcc 10.2、9.2 9.3和clang 11.0上测试过,结果是一样的。
这是一个错误吗?还是我在标准布局方面遗漏了什么?
#include <variant>
#include <iostream>
struct NewOrder
{
int i;
};
struct Cancel
{
virtual ~Cancel() {}
int j;
private:
int i;
};
int main() {
std::cout << std::is_standard_layout_v<std::variant<NewOrder, Cancel>> << std::endl;
return 0;
}
【问题讨论】:
-
你不检查
Cancel是否是标准布局,你检查std::variant<NewOrder, Cancel>是否是。那是一种完全不同且不相关的类型。 -
std::variant的内部结构看起来像std::aligned_storage<std::max({std::sizeof(Ts)...})> buffer; bool alternative;这都是标准布局。 -
@NathanOliver ,如果我删除虚拟方法。 is_standard_layout 将返回 false。所以只是变体的实现真的很棘手吗?
-
啊,variant 确实有不同的实现,用于可破坏或不可破坏的结构。这很有道理,感谢您的帮助