使用std::swap代替'='运算符进行赋值操作

8
我正在查看与我正在进行的宠物项目相关的库的C++源代码遇到了一些我不理解的问题。在我期望进行指针解引用和赋值的地方,库作者使用std::swap()在函数末尾写入结果:std::swap(*out, result);。我期望看到像这样的东西:*out = result;请注意,resultsize_ttypedefout是指向同一类型的指针。当涉及“系统编程”时,我的背景是C和C#,但几乎没有C ++方面的知识。这种类型的“赋值”有什么特殊原因吗?

1
如果在交换后没有使用result的值,那么std::move可能是更好的选择。另请参见什么是C++中的R-Value? - jww
@jww,在调用std::swap后,result没有被使用。 - easuter
1个回答

10

当值类型更加有趣时,例如std::vector<T>,可能更有意义的是将一个临时构造的对象通过std::swap()移到正确的位置,而不是赋值:考虑到临时结果即将消失,避免赋值并只改变指针是有些道理的。但是我不认为在像std::size_t这样的基本类型中做这样的事情有任何理由。


3
对于简洁的回答给予加一。或者,在C++11中,可以使用移动语义来消除赋值操作。需要指出的是,"swap"构造通常在拷贝和交换技巧(copy-and-swap idiom) https://dev59.com/73A75IYBdhLWcg3weY1f 中看到,当你想确保在抛出异常时不会使对象处于未定义状态时,可以使用它们。 - vsoftco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接