- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
N4424介绍 inline
变量(可以在多个翻译单元中定义的变量,在仅 header 库中很有用),但在 C++14 中不是。我一直在使用下面的方法来模拟它:
// a.hpp
#pragma once // to simplify
inline A& a_init() { static A a_obj; return a_obj; }
static A& a = a_init();
和
// b.hpp
#pragma once // to simplify
#include "a.hpp"
inline B& b_init() { static B b_obj{ use(a) }; return b_obj; }
static B& b = b_init();
cpp 文件使用 a
和 b
.没有其他使用 a_init
和 b_init
.
我认为:
a
must be initialized before b
, 在每个包含 b
的翻译单元中;b_init
, b_init
仅在初始化时调用 b
.从当时的1 a
必须已经初始化(a_init
必须返回);a_obj
is initialized when a_init
is called , b_obj
也是对于 b_init
;a_obj
和 a
在调用 b_init
之前初始化,因此 use(a)
是安全的,初始化顺序必须是A() < B()
(返回 A()
,然后调用 B()
);~B() < ~A()
.我的推理正确吗?这是 inline A a; inline B b{ use(a) };
的工作仿真吗?并保证 A() < B() < ~B() < ~A()
的顺序?
最佳答案
在不同翻译单元(即.cpp 文件)中定义的静态变量的初始化顺序可以唤起所谓的static initialization order fiasco。 .
幸运的是,有一种方法可以使用 Construct On First Use Idiom 来防止这种惨败。 .你所做的很像那个成语。
关于您的情况:由于 header “b.hpp”在 b
的定义之前包含 header “a.hpp”。当在翻译单元中包含“b.hpp”时,“a.hpp”也将包含在内。预处理器将分别用 header “a.hpp”和“b.hpp”的代码替换 include 指令,因为 #include "a.hpp"
位于 b 的定义之上
,a
将在 b
之前定义,因为“在同一编译单元中,顺序定义明确(即与定义相同的顺序) ”。因此,您强制使用正确的定义顺序。
因此,您的推理成立。我不知道这是否是 inline A a 的有效模拟;内联 B b{ use(a) };
.
关于c++ - 内联变量仿真 : can I use global static references to enforce the initialization order of static variable in functions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33296007/
我正在使用 maven 和 eclipse m2e 配置多模块父子 maven 项目,我使用的是 eclipse Juno SR1 的最新内容,即 m2e 1.2.0 父pom使用enforcer插件
我希望从我的基类派生的所有类都具有此功能: class Derived : public Base{ public: void doSth(const Derived& d){
我遇到了有关我的执行器自定义规则之一的配置问题。 我的 POM 文件中的插件配置如下所示: org.apache.maven.plugins maven-
假设我想在数据库的事件日志中记录某些内容。在某些情况下,这些事件与用户相关联(例如,用户创建了一些东西)。在某些情况下,这些事件是由应用程序自动完成的(例如,系统出于某种原因更新了一些记录)。我希望能
我的整个团队都相信 Python 中的类型提示将帮助我们构建更易于维护的代码。每个人都支持在我们的整个项目中实现类型提示。 使用 mypy 一周后,我们意识到 mypy 并没有真正提醒您实现类型提示。
我正在尝试使用 maven-enforcer-plugin 来确保激活一个配置文件(requireActiveProfile 规则)。请参阅此页面上的第二个示例:Require Active Prof
我已经在谷歌上搜索了两个小时,但没有成功。 如果我有一个模板函数并且我想在模板类型上强制执行一个接口(interface),我该怎么做? 例如。 void doStuff(T)(bool param)
我希望下面的函数只接受 data 对象,前提是其中有 id 键。然后,想要从 data 访问 id。 function someFuntion(data : T){ const id = data['
如果我实现 CQRS 和事件溯源,假设数据的最终存储(读取存储)在 RDBMS 中,我如何维护数据的完整性和一致性? 如果事件已发布但 RDBMS 由于检查违规或缺少 FK 引用而拒绝从中派生的数据怎
我希望下面的函数只接受 data 对象,前提是其中有 id 键。然后,想要从 data 访问 id。 function someFuntion(data : T){ const id = data['
我一直在尝试了解 Julialang 的类型系统但是一些设计方面仍然让我感到困惑。我希望有人能澄清一下。 所以这里的问题是关于抽象类型及其具体实现。从我understand Julia抽象类型不会对其
关注 https://stackoverflow.com/a/59389998/927493 ,现在可以从命令行调用 Maven 执行器插件。 这很好用,但不幸的是我还不明白我是否可以通过命令行设置规
以下是我看到的错误,让我困惑的是为什么它会依赖于 2 个版本的 my-engine 依赖项。一个是 0.9.0-20180510.015454-2,另一个是 0.9.0-SNAPSHOT。 这是我使用
fmtter = logging.Formatter('%(asctime)s,%(msecs)05.1f (%(funcName)s) %(message)s', '%H:%M:%S') rock_
我有一个抽象的 C# 基类,其中有几个必须重写的方法。我该如何执行?现在我抛出一个异常作为基本实现 public virtual string Description {
我正在尝试使用 maven 安装 UIMA JDK。然而,总有一个警告 Rule 0: org.semver.enforcer.RequireBackwardCompatibility failed
简介: 我已经为数据库过滤器构建了一个类层次结构: class Filter { } class PropertyFilter extends Filter { Boolean exists;
我正在将(由我)为 Windows 编写的项目移植到移动平台。 我需要 VirtualAlloc (+friends) 的等价物,自然是 mmap。但是,有 2 个显着差异。 VirtualAlloc
我想使用 Maven Enforcer 插件来检查我的路径上是否有重复的类。 我试过 here 中的示例. 但是当我这样运行时: mvn enforce:enforce 我收到这个错误: Failed
我正在开发一个跨平台的 Python (3.7+) 应用程序,我需要依赖 SQLite 中 TEXT 列的排序顺序,这意味着 TEXT 值的比较算法必须基于 UTF-8 字节。即使系统编码 (sys.
我是一名优秀的程序员,十分优秀!