【问题标题】:Can a default constructed DDS topic type be published?可以发布默认构造的 DDS 主题类型吗?
【发布时间】:2015-01-14 15:52:01
【问题描述】:
我正在使用带有 C++(C++11 绑定)的 OpenSplice DDS 6.4 OSS 版本。如果我尝试默认构造一个主题实例并发送它,也许会修改它的一些字段,我会在作者内心的某个地方得到访问冲突异常。这是一个错误,还是默认构造对象无效的预期行为?
我使用的 IDL 中有很多工会,我觉得这可能是相关的。
【问题讨论】:
标签:
data-distribution-service
【解决方案1】:
IDL to C++ 语言映射对联合的默认初始化有如下说明
默认联合构造函数不执行联合的应用程序可见初始化。它不会初始化鉴别器,也不会将任何联合成员初始化为对应用程序有用的状态。 (默认构造函数的实现可以做它想做的任何类型的初始化,但这种初始化是依赖于实现的。没有一个兼容的应用程序可以指望一个联合被默认构造函数单独正确初始化。)
因此构造一个默认的初始化主题实例并将其在线发送是不安全的。
作为参考,IDL to C++11 语言映射表示以下内容
默认联合构造函数初始化联合。如果指定了默认情况,则将联合初始化为此默认情况。如果联合具有隐式默认成员,则将其初始化为该情况。在所有其他情况下,它被初始化为空。分配、复制、移动和销毁默认构造的联合是安全的。