在我最近建立一个项目时,我注意到我收到了关于重新定义的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){} \
为什么有两个不同版本的宏,哪一个更有意义?将强制内置类型初始化的那个,或者不强制内置类型的那个(尽可能接近地模仿基础类型强类型化)?
答案 0 :(得分:16)
我是boost/strong_typedef.hpp
两个版本的作者。
由于强烈反对直接包含在boost基本标题中,我转移到了序列化库。为了保持向后兼容性,我把它留在了boost base头目录中。我忘了将此文件合并到发布分支中,因此会出现警告。我也忘记将名称更改为BOOST_SERIALIZATION_STRONG_TYPEDEF
。从那时起,我将初始化添加到基类。我想自从我进行了拆分后,我在序列化库中包含了版本修正。
我刚看了一下序列化库,现在使用strong_typedef是最小的。我想我会彻底解决它。那么它就会完全消失。
它确实应该是一个单独的实用程序。但我无法真正处理所需的所有提升(测试,文档,构建,审查)。并且boost对于这些小型头文件实用程序没有一个非常好的位置。有一天,我希望序列化库所需的这些小工具将迁移到boost基础。但是我开始对这个想法感到气馁。
答案 1 :(得分:15)
看起来boost/strong_typedef.hpp
目录是一个历史工件。
缺少t
成员的显式初始化是几年前在{svn修订版71183中boost/serialization/strong_typedef.hpp
修复的错误。请参阅the bug ticket。
在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,posted a comment in another bug ticket关于strong_typedef.hpp
的作者,你可能会感兴趣:< / p>
我认为序列化库不再使用它了。当然它还在那里。我不知道是否有人使用它。