我给出的代码示例是有效的 C++ 吗?
不可以。不允许使用匿名结构,因此该程序格式不正确。
它在 Clang 和 MSVC 中工作的原因是什么
当一个格式错误的程序运行时,通常是由于语言扩展造成的。
但不在海湾合作委员会
也许类似语言扩展的实现存在差异。当然,这种扩展的限制不是由语言定义的。由于此扩展基于 C 语言功能,因此它不一定适用于构造函数等 C++ 功能,这是有道理的。
我可以对其进行哪些更改以使其在 GCC 中工作,而不涉及删除构造函数或在联合中命名结构?
使程序明确定义 C++ 的唯一方法是不使用匿名结构。
额外答案:如果您希望阅读elements
写信给之后normal
or d
反之亦然,那么这也是不允许的。程序的行为是未定义的。
如何使用重叠内存创建不同名称的属性?除了 Plane 之外,我还想在其他结构中执行此操作,例如通过 3D Basis 结构 columns[3] ,其中数组的成员也可通过 x、y 和 z 访问。
C++在这方面有局限性,不能用简单的方法来完成。可以通过依赖运算符重载来完成,但有点复杂:
template<class T, std::size_t size, std::size_t i>
struct Pun {
T a[size];
static_assert(i < size);
auto& operator=(T f) { a[i] = f; return *this; }
operator T&() & { return a[i]; }
operator const T&() const & { return a[i]; }
operator T () && { return a[i]; }
T * operator&() & { return a+i ; }
T const* operator&() const & { return a+i ; }
};
template<class T, std::size_t size>
struct Pun<T, size, size> {
T a[size];
using A = T[size];
operator A&() & { return a; }
operator const A&() const & { return a; }
A * operator&() & { return &a; }
A const* operator&() const & { return &a; }
};
union Plane {
Pun<float, 4, 4> elements;
Pun<float, 4, 0> x;
Pun<float, 4, 1> y;
Pun<float, 4, 2> z;
Pun<float, 4, 3> d;
};
读取不活跃成员Plane
是允许的,因为所有元素都是布局兼容的结构。x
等可以隐式转换为 float 和elements
可以隐式转换为 float 数组。