在我最近建立一个项目时,我注意到有一个关于BOOST_STRONG_TYPEDEF重新定义的宏的编译器警告(转向错误).经过进一步调查,我注意到strong_typedef.hppboost 中有两个不同的版本:一个位于顶层,一个位于顶层serialization/.
两个版本之间实际上也存在差异,而不仅仅是宏的重复版本.T在序列化版本执行时,顶级版本没有显式地为value-init ;
代码剪辑:
boost/strong_typedef.hpp:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(){}; \
D(const D & t_) : t(t_.t){} \
Run Code Online (Sandbox Code Playgroud)
boost/serialization/strong_typedef.hpp:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(): t() {}; \
D(const D & t_) : t(t_.t){} \
Run Code Online (Sandbox Code Playgroud)
为什么有两个不同版本的宏,哪一个作为实现更有意义?将强制内置类型初始化的那个,或者不强制内置类型的那个(尽可能地模仿基础类型强类型化)?
Rob*_*mey 16
我是两个版本的作者boost/strong_typedef.hpp.
由于强烈反对直接包含在boost基本标题中,我转移到了序列化库.为了保持向后兼容性,我把它留在了boost base头目录中.我忘了将此文件合并到发布分支中,因此会出现警告.我也忘了把名字改成BOOST_SERIALIZATION_STRONG_TYPEDEF.从那时起,我将初始化添加到基类.我想自从我进行了拆分后,我在序列化库中包含了版本修正.
我只是查看了序列化库,现在使用strong_typedef是最小的.我想我会彻底解决它.那么它就会完全消失.
它应该是一个单独的实用程序.但我无法真正处理所需的所有提升(测试,文档,构建,审查).并且boost对于这些小型头文件实用程序没有一个非常好的位置.有一天,我希望序列化库所需的这些小工具将迁移到boost基础.但是我开始对这个想法感到气馁.
Mic*_*urr 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"
Run Code Online (Sandbox Code Playgroud)
这个变化,r48575,是在2008年制作的 - 我不知道为什么它从未被合并到一个版本中.也许是因为它会在没有很大好处的情况下打破用户,或者可能是一种疏忽.同样的变化(r48575)是boost/serialization/strong_typedef.hpp在后备箱中创造的.
如果他们不想破坏现有用户,那么被弃用的文件可能只包含该文件,boost/serialization因此只有一个规范的实现.在任何情况下,似乎如果你可以避免使用boost/strong_typedef.hpp赞成使用serialization,那就是我的建议.
作为旁注,请记住,一年前,Boost Serialization(和strong_typedef.hpp)的作者Bob Ramey 在另一个关于strong_typedef.hpp您可能感兴趣的错误故障单中发表评论:
我认为序列化库不再使用它了.当然它还在那里.我不知道是否有人使用它.