C++ 11重载方法,转发到一个独特的方法

gre*_*f82 8 c++ c++11

我在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不接受左值引用,因此无效.

Sto*_*ica 7

如果您不需要修改参数,则根本不需要 rvalue重载1.const左值引用将很好地绑定到右值.

这就是C++始终如何工作,并且右值引用不会改变它.

这么简单

void overloaded_function(const std::string& param) {
  //someStuffHere
}
Run Code Online (Sandbox Code Playgroud)

将绑定到任何值类别的参数.


1 - 如果你确实需要修改它,那么传递rvalues有点可疑.


Pio*_*ycz 5

一旦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)

  • 我知道,我是一个挑剔的人,但它仍然是一个r值参考.恰好相反,r值引用本身就是l值. (3认同)