You need to enable JavaScript to run this app. Pimpl模式中使用移动语义向Impl构造传递std::string参数是否正确?
优惠活动
大模型
产品
解决方案
定价
更多

Pimpl模式中使用移动语义向Impl构造传递std::string参数是否正确?

结论

你给出的第一种实现是完全正确的,相比仅接收右值引用的第二种写法适用性更广,是C++中传递可移动类型参数的标准实践。

两种写法的差异分析

第一种写法(按值传参)

Impl(string s) : s_(std::move(s)) {}
  • 性能无损失:你当前的调用链路中,Foo构造函数已经通过std::move(s)将参数转为右值传递给Impl的构造函数,此时参数s只会调用一次std::string的移动构造完成初始化,后续初始化成员s_再调用一次移动,整体开销和右值引用传参完全一致。
  • 兼容性更好:按值传参可以同时接收左值、右值输入,如果你后续有场景需要传入具名的左值字符串变量,不需要额外重载构造函数,传左值时自动调用拷贝构造,传右值自动调用移动构造,代码维护成本更低。

第二种写法(右值引用传参)

Impl(string&& s) : s_(std::move(s)) {}

这种写法仅能接收右值参数,如果你尝试传入一个具名的左值字符串变量,编译会直接报错。在你当前的代码场景下虽然也能正常运行,但灵活性更差,也没有带来任何额外的性能收益,没有必要特意这么写。

内容的提问来源于stack exchange,提问作者VladG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 03:27:03