C 11 的类内初始化扩展:打破链接障碍
在 C 03 中,类内初始化仅限于静态 const 成员整数或枚举类型。此限制源于对违反需要对象唯一定义的链接器规则的担忧。
但是,C 11 显着放宽了这些限制,允许非静态和非常量成员的类内初始化。这就提出了如何解决链接的潜在复杂性的问题。
与最初的直觉相反,链接器的操作基本上保持不变。相反,编译器承担处理类内初始化的责任。它通过确保只为类成员生成一个定义来实现这一点,即使它们是在类内初始化的。
这一更改确实给编译器带来了额外的复杂性,但对程序员的影响通常很小。当类成员有多个初始值设定项时,需要注意一点。在这种情况下,编译器根据使用的特定构造函数确定哪个初始化器优先。
例如,考虑以下类:
class X { int a = 1234; public: X() = default; X(int z) : a(z) {} };
使用默认构造函数创建对象时, 'a' 的值被初始化为 1234。但是,如果使用显式指定 'a' 值的构造函数,则类内初始化为忽略。
X x{5678};
在这种情况下,“x”对象中“a”的值将为 5678。此行为可确保类成员始终初始化为最合适的值,即使在存在多个初始化器。
总体而言,C 11 中类内初始化功能的扩展为程序员提供了更大的灵活性和便利性,同时又不影响完整性整个链接过程。
以上是C 11 如何处理类内初始化而不发生链接器冲突?的详细内容。更多信息请关注PHP中文网其他相关文章!