假设我有一个类,其唯一目的是在构造其对象期间引起的副作用(例如,向工厂注册一个类):
class SideEffectCauser {
public:
SideEffectCauser() { /* code causing side-effects */ }
};
还假设我想让一个对象为几个翻译单元中的每一个创建一次这样的副作用。对于每个这样的翻译单元,我希望能够SideEffectCauser
在 .cpp 文件的命名空间范围内放置一个对象,例如,
SideEffectCauser dummyGlobal;
但是 C++03 标准的 3.6.2/3 建议根本不需要构造该对象,除非使用 .cpp 文件中的对象或函数,并且诸如此类的文章和诸如此类的在线讨论表明此类对象有时未初始化。
另一方面,有没有办法从保存类名的字符串中实例化对象?有一个声称可以工作的解决方案,我注意到它是基于使用类型的对象SideEffectCauser
作为静态数据成员,而不是作为全局对象,例如,
class Holder {
static SideEffectHolder dummyInClass;
};
SideEffectHolder Holder::dummyInClass;
两者dummyGlobal
和dummyInClass
都是非局部静态,但仔细查看 C++03 标准的 3.6.2/3 会发现该段落仅适用于命名空间范围内的对象。我实际上在 C++03 标准中找不到任何说明何时动态初始化类范围内的非局部静态变量的内容,尽管 9.4.2/7 建议与命名空间中的非局部静态变量相同的规则适用于它们范围。
问题 1:在 C++03 中,有没有理由相信dummyInClass
比 更有可能被初始化dummyGlobal
?或者如果没有使用同一翻译单元中的函数或对象,两者都可能未初始化?
问题 2:C++11 有什么变化吗?3.6.2 和 9.4.2 中的措辞与 C++03 版本不同,但据我所知,对于我上面描述的场景没有指定行为差异。
问题 3:是否有可靠的方法来使用类的对象(例如SideEffectHolder
在函数体外部)来强制发生副作用?