需修改参数且保留原变量时,传值还是const引用更优?
回答
你的判断完全正确,Bar2的写法确实能保证传入右值时触发移动构造,避免不必要的拷贝,具体细节如下:
右值场景的标准保证
当传入右值(比如临时对象、被std::move()转换后的左值)时,Bar2的形参x会优先匹配X的移动构造函数——只要X拥有合法的移动构造(哪怕是编译器自动生成的默认版本),这是C++标准明确规定的行为,不存在歧义。两种写法的效率对比
- 对于左值输入:
Bar2会先拷贝构造形参x,和Bar1里拷贝局部变量的成本完全一致; - 对于右值输入:
Bar1里的auto mutable_x {x};只能触发拷贝构造(因为x是const X&类型,无法从const引用绑定的右值触发移动),而Bar2可以直接移动,开销远低于拷贝。
- 与C++核心指南的契合度
虽然核心指南没有直接针对这种场景给出条目,但它的核心原则之一就是避免不必要的拷贝,Bar2的写法完全符合这一原则,没必要刻意退回到Bar1的实现。
内容的提问来源于stack exchange,提问作者Anthony Poole
相关产品推荐
相关产品推荐

