Boost 1.72.0 time_duration隐式拷贝赋值运算符弃用编译错误修复咨询
修复Boost 1.72.0中time_duration拷贝赋值运算符弃用的编译错误
问题根源
Boost 1.72.0的boost::posix_time::time_duration类(包括其派生类如microseconds)存在用户声明的拷贝构造函数,根据C++11及以后标准,编译器会隐式弃用其拷贝赋值运算符。当开启-Werror,-Wdeprecated-copy编译选项时,对该类型成员执行赋值操作就会触发错误。
修复方法
1. 升级Boost版本(推荐)
Boost在1.73.0及后续版本中,已经为time_duration显式添加了拷贝赋值运算符,彻底修复了这个问题。直接升级到最新稳定版Boost是最一劳永逸的解决方案。
2. 临时禁用特定编译警告
如果暂时无法升级Boost,可以针对涉及time_duration赋值的代码块禁用-Wdeprecated-copy警告:
// GCC/Clang 编译器 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-copy" // 包含time_duration赋值操作的代码 boost::posix_time::time_duration td; td = boost::posix_time::microseconds(100); #pragma GCC diagnostic pop
MSVC编译器对应指令:
#pragma warning(push) #pragma warning(disable: 4996) // 需根据实际警告码调整 // 赋值代码 #pragma warning(pop)
3. 使用swap替代直接赋值
利用time_duration的swap成员函数转移值,避免触发拷贝赋值运算符:
boost::posix_time::time_duration td; boost::posix_time::microseconds us(100); td.swap(us);
类成员赋值场景示例:
class MyClass { boost::posix_time::time_duration m_td; public: void set_duration(const boost::posix_time::microseconds& duration) { boost::posix_time::time_duration temp(duration); m_td.swap(temp); } };
4. 直接初始化而非赋值
如果逻辑允许,尽量在定义时直接初始化time_duration对象,避免后续赋值:
// 直接初始化,替代先定义后赋值 boost::posix_time::time_duration td = boost::posix_time::microseconds(100);
内容的提问来源于stack exchange,提问作者q0987
相关产品推荐
相关产品推荐

