我在c ++ 11中有以下类:
#include <iostream>
#include <string>
#include <utility>
void overloaded_function(const std::string& param) {
someStuffHere
}
void overloaded_function(std::string&& param) {
someStuffHere
}
Run Code Online (Sandbox Code Playgroud)
如您所见,overloaded_function实现完全相同.我想创建一个新函数,而不是将相同的实现创建到两个不同的方法中.我尝试过:
void overloaded_function(const std::string& param) {
uniqueCall(std::forward<std::string&>(param));
}
void overloaded_function(std::string&& param) {
uniqueCall(std::forward<std::string&&>(param));
}
void uniqueCall(T&& param) {
someStuffHere
}
Run Code Online (Sandbox Code Playgroud)
但由于uniqueCall不接受左值引用,因此无效.
如果您不需要修改参数,则根本不需要 rvalue重载1.const左值引用将很好地绑定到右值.
这就是C++始终如何工作,并且右值引用不会改变它.
这么简单
void overloaded_function(const std::string& param) {
//someStuffHere
}
Run Code Online (Sandbox Code Playgroud)
将绑定到任何值类别的参数.
1 - 如果你确实需要修改它,那么传递rvalues有点可疑.
一旦r值参数得到一个名称 - 它可以被视为l值引用,这可以在http://en.cppreference.com/w/cpp/language/value_category中阅读:
即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式;
所以你可能写得这么简单:
void overloaded_function(std::string& param) {
someStuffHere
}
void overloaded_function(std::string&& param) {
overloaded_function(param); // here param type is std::string&
}
Run Code Online (Sandbox Code Playgroud)
如果你真的喜欢拥有"共同"功能 - 它应该接受左值参考,原因如下:
void uniqueCall(std::string& param) {
some stuff here
}
void overloaded_function(std::string& param) {
uniqueCall(param)
}
void overloaded_function(std::string&& param) {
uniqueCall(param); // here param type is std::string&
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
593 次 |
最近记录: |