隐藏单个函数背后的移动语义

use*_*257 2 c++ move move-semantics c++11

例如,我有一个可以处理const T &T &&值的函数:

template <typename T>
/* ... */ foo(const T &) {
std::cout << "const T & as arg" << std::endl;
}

template <typename T>
/* ... */ foo(T &&) {
std::cout << "T && as arg" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以编写单个函数,自动处理这两种类型?如:

template <typename T>
/* ... */ bar(T t) {
    foo(t);
}
Run Code Online (Sandbox Code Playgroud)

以便:

T a;
bar(a); // Handles as const T &
T b;
bar(std::move(b)); // Handles as T &&
Run Code Online (Sandbox Code Playgroud)

谢谢!

Sho*_*hoe 8

您可以使用参考崩溃,std::forward转发的参数传递给foo函数:

template <typename T>
/* ... */ bar(T&& t) {
    foo(std::forward<T>(t));
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的foo函数将接受rvalues,常量左值和非常量左值.举个例子,给出:

const int x = 456;
int y = 123;
Run Code Online (Sandbox Code Playgroud)

然后:

foo(123);   // foo(T&&)
foo(x);     // foo(const T&)
foo(y);     // foo(T&&)
Run Code Online (Sandbox Code Playgroud)

Live demo