为何静态局部实例的构造函数不会被第二次调用?
函数内静态局部变量的初始化规则解析
先看你提供的代码:
#include <iostream> class my_class { public: static my_class& factory(int val) { static my_class instance{val}; return instance; } private: my_class(int value) { std::cout<<value<<std::endl; }; }; int main() { auto& i77 = my_class::factory(77); // 调用#1 auto& i1 = my_class::factory(1); // 调用#2 return 0; }
调用#2时发生了什么?
第一次调用factory(77)时,程序执行到static my_class instance{val};这一行:
- 静态局部变量
instance会被分配到程序的静态存储区,同时用传入的77作为参数调用构造函数,输出77。 - 一旦这个静态变量完成初始化,后续任何时候再执行到这条定义语句时,都会直接跳过初始化步骤——不会再次调用构造函数,直接返回已经存在的
instance对象的引用。
所以第二次调用factory(1)时,虽然传入的val是1,但程序不会构造新的instance,直接把第一次创建的对象引用返回给i1,自然不会触发构造函数的输出。
该行为是否符合C++标准?
完全符合。C标准明确规定:函数内部的静态局部变量,只会在程序第一次执行到该变量的定义语句时完成初始化,后续执行到该语句时不会重复初始化。这个规则从C98标准开始就存在,C++11之后还额外保证了这种初始化是线程安全的(多个线程首次同时访问时,只会有一个线程完成初始化,其他线程等待)。
内容的提问来源于stack exchange,提问作者Xeenych Xeenych
相关产品推荐
相关产品推荐

