C++自定义vl_string类多次调用+=运算符后修改回滚问题求助
问题根源:
operator+=返回值错误导致链式调用失效 你的问题核心在于**operator+=的返回类型是值而非引用**,这直接导致链式调用时后续操作都是在临时副本上执行,而非原对象。
为什么会出现这个问题?
C++中,operator+=的常规设计是返回对象的引用(T&),这样链式调用(比如a += b += c)才能持续修改同一个对象。但你的代码里,operator+=声明的返回类型是vl_string<StaticCapacity>(值返回):
vl_string<StaticCapacity> operator+=(const vl_string<StaticCapacity>&vs); vl_string<StaticCapacity> operator+=(const char *str); vl_string<StaticCapacity> operator+=(char c);
当你执行(((vl_str += vl_str_to_add) += ' ') += "say goodbye") += '\n';时:
vl_str += vl_str_to_add:修改原vl_str,然后返回原对象的副本- 后续的
+= ' '、+= "say goodbye"、+= '\n'都是在这个临时副本上操作 - 语句结束后,临时副本被销毁,原
vl_str只保留了第一次+= vl_str_to_add的修改,后面的操作全部丢失
修复方案:修改返回类型为引用
把所有operator+=的返回类型改成vl_string<StaticCapacity>&,并确保返回*this(当前对象的引用):
修改后的声明:
vl_string<StaticCapacity>& operator+=(const vl_string<StaticCapacity>&vs); vl_string<StaticCapacity>& operator+=(const char *str); vl_string<StaticCapacity>& operator+=(char c);
修改后的实现:
template<size_t StaticCapacity> vl_string<StaticCapacity>& vl_string<StaticCapacity>::operator+= (const char *str) { size_t len = strlen(str); vl_string<StaticCapacity>::insert(this->end() - 1, str, str + len); return *this; // 返回当前对象的引用 } template<size_t StaticCapacity> vl_string<StaticCapacity>& vl_string<StaticCapacity>::operator+= (const char c) { this->push_back (c); return *this; // 返回当前对象的引用 } template<size_t StaticCapacity> vl_string<StaticCapacity>& vl_string<StaticCapacity>::operator+= (const vl_string &vs) { auto first = vs.cbegin(); auto last = vs.cend() - 1; while (first != last) { this->push_back (*first); first++; } return *this; // 返回当前对象的引用 }
验证修复效果
修改后,链式调用的每一步都会直接修改原vl_str对象,临时副本不再产生,你的断言assert(vl_str.contains ("Never gonna say goodbye\n"));就能正常通过,析构时也不会丢失后续修改的内容。
内容的提问来源于stack exchange,提问作者Wolf
相关产品推荐
相关产品推荐

