为何std::string&重载函数被调用而非std::string&&重载函数?
为何std::string&重载函数被调用而非std::string&&重载函数?
嘿,这个问题的核心其实是C++里一个容易踩的小坑:右值引用变量本身是左值!
咱们拆解下你的代码流程:
- 你创建了
foo这个普通的std::string左值,用std::move(foo)把它转换成右值类型,接着绑定到bar——这个std::string&&类型的变量上。 - 但要注意!
bar是有名字的变量,只要是有名字的实体,在C++里都会被当作左值处理,哪怕它的类型是右值引用。所以当你调用process(bar)时,编译器看到的是一个左值参数,自然会匹配接受左值引用的process(std::string&)重载,输出就是reference: foo了。
如果想调用右值引用的重载版本,你需要再次把bar转换成右值,比如用std::move(bar)或者std::forward<std::string&&>(bar),这样编译器就会匹配process(std::string&&),输出moved: foo啦。
备注:内容来源于stack exchange,提问作者Jacob Krieg
相关产品推荐
相关产品推荐

