模板类中的静态成员初始化复杂性
C 中的静态成员初始化是一种广泛使用的技术,但在处理时可能会变得复杂模板化的类。在非模板化类中,可以采用嵌套辅助结构进行初始化,但当封闭类模板化时,这种方法就不够了。
考虑以下简化示例:
<code class="cpp">struct A { static std::string mA; static InitHelper mInit; static const std::string& getA() { return mA; } }; std::string A::mA; A::InitHelper A::mInit; template<class T> struct B { static std::string mB; static InitHelper mInit; static const std::string& getB() { return mB; } static InitHelper& getHelper() { return mInit; } }; template<class T> std::string B<T>::mB; template<class T> typename B<T>::InitHelper B<T>::mInit; int main() { std::cout << "A = " << A::getA() << std::endl; // Comment/uncomment lines to observe different behaviors // std::cout << "B = " << B<int>::getB() << std::endl; // [1] // B<int>::getHelper(); // [2] }</code>
预期行为:
当 [1] 被取消注释并且 [2] 被注释时,我们期望 B
实际行为:
差异的原因:
根据 ISO/IEC C 2003 标准,在需要其定义的上下文中引用模板成员时,会隐式实例化模板成员。存在。但是,静态数据成员初始化(以及任何相关的副作用)仅在显式使用静态数据成员时发生。这意味着,如果模板成员仅在未实例化的模板中或在不需要其完全实例化的其他上下文中引用,则其静态数据成员将不会被初始化。
在示例中,B
解决方案:
该标准禁止显式专用类模板静态数据成员的定义进行有序初始化,而其他类模板静态数据成员进行无序初始化。为了确保一致的初始化顺序,必须使用显式特化。
以上是为什么模板类中的静态成员初始化行为不同?的详细内容。更多信息请关注PHP中文网其他相关文章!