为什么boost包含两个不同版本的strong_typedef.hpp ?

Why does boost include two different versions of strong_typedef.hpp?

本文关键字:strong typedef hpp 版本 包含两 boost 为什么      更新时间:2023-10-16

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

实际上这两个版本之间也有区别,而不仅仅是宏的重复版本。顶层版本不显式地值初始化它的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){}                                 

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

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

由于强烈反对直接在boost基头文件中包含

,我转向了序列化库。为了保持向后兼容性,我将其留在boost基本头目录中。我忘记将这个文件合并到发布分支中,所以会出现警告。我也忘了把名字改成BOOST_SERIALIZATION_STRONG_TYPEDEF。从那时起,我将初始化添加到基类中。我想既然我做了拆分,我在序列化库中包含了一个版本更正。

我刚看了一下序列化库,现在strong_typedef的使用很少了。我想我会抽时间把它全部去掉。那么它就会完全消失。

它真的应该是一个单独的实用程序。但我无法真正处理所有的提升要求(测试、文档、构建、审查)。boost并没有为这些只有头文件的实用程序提供一个很好的位置。有一天,我希望序列化库所需的这些小实用程序能够迁移到boost基库。但后来我打消了这个念头。

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

缺少t成员的显式初始化是几年前在svn revision 71183中修复的boost/serialization/strong_typedef.hpp中的错误。

在Boost的Subversion主干中,boost/strong_typedef.hpp基本上是一个空文件,上面写着:

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

r48575这个改动是在2008年做的——我不知道为什么它从来没有被合并到一个版本中。也许是因为它会让用户失去很多好处,也许这是一个疏忽。同样的更改(r48575)是在trunk中创建boost/serialization/strong_typedef.hpp的原因。

如果他们不想破坏现有的用户,那么也许弃用的文件应该只包含boost/serialization中的文件,这样就有一个单一的,规范的实现。在任何情况下,如果你可以避免使用boost/strong_typedef.hpp而使用serialization,这就是我的建议。

作为旁注,请记住,一年前Boost序列化(和strong_typedef.hpp)的作者Bob Ramey在另一个关于strong_typedef.hpp的错误票中发表了一个评论,您可能会觉得有趣:

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