请问大佬们下面这样的代码是 UB 么?

2018-12-18 17:50:02 +08:00
 wutiantong
#include <iostream>

template<std::size_t D>
struct FakeNest
{
    int & get() noexcept { return all_[0]; }
    FakeNest<D-1> &sub() noexcept { return *reinterpret_cast<FakeNest<D-1> *>(&all_[1]); }
    private: int all_[D];
};

int main()
{
    FakeNest<4> a;
    a.sub().sub().get() = 666;
    std::cout << *(&a.get() + 2) << std::endl;
}

结果是符合预期的,但总觉得这种写法有点太作弊了,算不算 UB 呢?

几个可能相关的 topic 是:

  1. reinterpret_cast
  2. pointer-interconvertible
  3. Standard_layout
2421 次点击
所在节点    C
2 条回复
chinuno
2018-12-18 19:04:44 +08:00
算是 ub。看编译器实现吧。早期的 c++编译器对象模型是每个对象内存既带成员又带函数指针不能这样玩。现在的各个编译器如果不带虚函数不是虚继承基本上跟 c 结构体一样的内存分布用起来没问题,但是不能保证以后哪次更新编译器实现变了还能保持工作
lrxiao
2018-12-19 09:57:59 +08:00
FakeNest<D-1> 和 int 不 pointer-interconvertible 啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/518707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX