c – 类静态变量初始化的规则是什么?
我有一些遗留代码,我需要为消息添加一个新类(这与我的问题无关).但事实证明,我需要声明一个空构造函数,以便初始化一些静态.不是默认构造函数或编译器提供的,而是用户定义的空.我试图将代码减少到MWE,在这里得到的结果是:
#include <iostream> using namespace std; struct Test { Test() {cout << "Test::Test()" << "n";} void dummy(){} }; template<typename T> struct Message { Message() { test.dummy(); // this call have to be here in order to initialize Test,but why? } static Test test; }; template<typename T> Test Message<T>::test; struct A : public Message<A> { //A(){} // uncomment this (and comment the default one) to call the Test constructor A() = default; }; int main() { } 这就是发生的事情: >程序本身是空的,即没有创建实例. 问题是如果我不提供自定义构造函数,那么静态构造函数永远不会被调用.我无法理解为什么需要这个?与默认或编译器生成的有什么区别?为什么我需要调用虚函数? 我相信这是有规则的.我用不同版本的gcc和clang检查了它 – 行为是一样的.我非常感谢标准/文档的链接. 解决方法
如果你保留一个构造函数默认并且从不调用它,那么就不需要生成它,因此不需要创建测试.如果在定义时显式默认它,请调用A构造函数或访问A :: test,它将被正确初始化.
struct A : public Message<A> { A() = default; // no constructor is emitted unless A is instantiated A(); // declaration }; A::A() = default; // explicit default definition int main() { A a; // instantiation A::test; // just explicitly access test so it is initialized regardless of A constructor } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |