15

当我最近在构建一个项目时,我注意到我收到了关于BOOST_STRONG_TYPEDEF重新定义宏的编译器警告(变成错误)。经过进一步调查,我注意到strong_typedef.hppboost 中包含两种不同的版本:一种在顶层,另一种在serialization/.

这两个版本之间实际上也存在差异,而不仅仅是宏的重复版本。顶级版本没有明确地 value-init 它T,而序列化版本有:

代码片段:

boost/strong_typedef.hpp

    T t;                                                        \
    explicit D(const T t_) : t(t_) {};                          \
    D(){};                                                      \
    D(const D & t_) : t(t_.t){}                                 \

boost/serialization/strong_typedef.hpp

    T t;                                                        \
    explicit D(const T t_) : t(t_) {};                          \
    D(): t() {};                                                \
    D(const D & t_) : t(t_.t){}                                 \

为什么有两种不同版本的宏,哪一种作为实现更有意义?一种会强制初始化内置类型,还是不会(尽可能模仿被强类型定义的底层类型)?

4

2 回答 2

18

我是两个版本的作者boost/strong_typedef.hpp

由于强烈反对将其直接包含在 boost 基本标头中,因此我转向了序列化库。为了保持向后兼容性,我把它留在了 boost 基本头目录中。我忘记将此文件合并到发布分支中,所以会出现警告。我也忘记改名字了BOOST_SERIALIZATION_STRONG_TYPEDEF。从那时起,我将初始化添加到基类中。我想自从我进行拆分以来,我在序列化库中包含了版本的更正。

我刚刚查看了序列化库,strong_typedef 的使用现在很少。我想我会设法完全删除它。那么它将完全消失。

它确实应该是一个单独的实用程序。但我无法真正处理所有这些提升要求(测试、文档、构建、审查)。并且对于这些只有小标题的实用程序,boost 并没有真正的好地方。有一天,我希望序列化库所需的这些小实用程序能够迁移到 boost 库。但我开始对这个想法感到灰心。

于 2013-06-16T19:14:24.190 回答
15

看起来boost/strong_typedef.hpp目录是一个历史文物。

t成员缺乏显式初始化是boost/serialization/strong_typedef.hpp几年前在 svn 修订版 71183 中修复的错误。请参阅错误票

在 Boost 的 Subversion 主干中,boost/strong_typedef.hpp有一个大部分为空的文件,上面写着:

#error "This header is deprecated. Please use: boost/serialization/strong_typedef.hpp"

这个更改,r48575,是在 2008 年做出的——我不知道为什么它从来没有被合并到一个版本中。也许是因为它会在没有太多好处的情况下破坏用户,或者是疏忽。同样的更改(r48575)是boost/serialization/strong_typedef.hpp在主干中创建的。

如果他们不想破坏现有用户,那么可能不推荐使用的文件应该只包含该文件,boost/serialization以便有一个单一的规范实现。无论如何,如果您可以避免使用boost/strong_typedef.hppin 来支持使用 in serialization,这就是我的建议。

作为旁注,请记住,一年前 Boost Serialization(和strong_typedef.hpp)的作者 Bob Ramey在另一个 bug 票证中发表了一条strong_typedef.hpp可能会感兴趣的评论:

我认为序列化库不再使用它了。当然它还在里面。我不知道是否有人使用它。

于 2013-06-04T09:03:40.823 回答