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