我知道访问
union
的非活动成员是UB,但是调用零大小且琐碎的联合成员的成员函数怎么样?从技术上讲,它不是访问,所以我希望它是有效的,但我找不到关于它的确切参考。
换句话说,
[[no_unique_address]]
可以在没有EBO的C++20之前用union
实现吗?
template<typename T>
struct MyVector {
union {
T* ptr{};
// Just an example. Suppose that is_trivial<alloc> == true and is_empty_v<alloc> == true
std::allocator<T> alloc;
};
explicit MyVector(std::size_t size) {
// Is this UB?
ptr = alloc.allocate(size);
}
};
[basic.life]/7.2 使得在对象的生命周期开始 UB 之前调用对象上的任何非静态成员函数,无论对象或函数的任何属性如何。