为什么boost包含两个不同版本的strong_typedef.hpp ?
Why does boost include two different versions of strong_typedef.hpp?
当我最近正在构建一个项目时,我注意到我得到了一个关于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
的错误票中发表了一个评论,您可能会觉得有趣:
我认为序列化库不再使用这个了。当然还在里面。我不知道是否有人使用它。
- C++:TypeDef使用元组
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 为什么在使用typedef时类推导指南会失败
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- typedef 枚举和枚举类有什么区别?
- 在类模板中使用 typedef 时出错
- 模板类中的 typedef 语句
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- 向前声明指向类的 typedef 指针
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何创建 typedef 结构的前向声明
- 从 Typedef 数据类型中删除常量
- typedef vector size_type in header file
- typedef 别名的析构函数
- 如何使用 typedef 创建多个数组?
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- 如何在编译时检查两种类型是否相同(奖励点是否可与Boost strong typedef一起使用)