有或没有标准布局的std :: pair:reinterpret_cast安全吗?

时间:2018-04-14 20:03:18

标签: c++ stl

如果两个班级AB属于standard layoutB被定义为

class B {
  // any methods
  A a;
}

然后安全地做

A a;
B* b = reinterpret_cast<B*>(&a);

如果A现在被std::pair<T1, T2>替换,那么这对每个可能的T1, T2都有用吗?据我所知,std::pair<T1, T2>是标准布局,如果T1T2都是标准布局,但如果它们不是,那么这会影响安全的可能性{ {1}}在这种情况下?

1 个答案:

答案 0 :(得分:1)

  

如果A现在被std::pair<T1, T2>替换,那么这对每个可能的T1T2都有用吗?

不,它甚至不能在这种特定情况下工作。

  

这会影响在这种情况下安全reinterpret_cast的可能性吗?

完全没有。演员在两种情况下都无效。

您违反了非正式的严格别名规则。更具体地说,根据标准,您将指向对象(此处为&a,其中a为对象)指向B*。由于您没有对象B*而尝试取消引用B将是UB。

你可能认为你有一个对象,但实际上,根据标准,你不会。来自[intro.object]p1

  

对象由定义([basic.def])创建,由new-expression创建,隐式更改union的活动成员([class.union]),或者何时创建一个临时对象([conv.rval],[class.temporary])。

这些情况都不适用,所以如果你试图使用&#34;对象&#34;你有UB。 b不是一个。

现在,您应该参考您的实现,因为许多实现为像您的IIRC这样的构造提供了基本保证。