std::forward
和 std::move
的区别是众所周知的,我们使用后者来保留转发对象的值类别,并使用前者强制转换为右值引用以启用移动语义。在《effective modern C++》中,存在一个指南,它规定:
“在右值引用上使用
std::move
,在通用引用上使用 std::forward
。”然而,在以下场景(以及不想改变值类别的场景)中,
template <class T>
void f(vector<T>&& a)
{
some_func(std::move(a));
}
如果 a
不是一个转发引用而只是一个简单的右值引用,那么下面这样做不是完全相同吗?
template <class T>
void f(vector<T>&& a)
{
some_func(std::forward<decltype(a)>(a));
}
由于这可以轻松地封装在类似于这样的宏中,
#define FWD(arg) std::forward<decltype(arg)>(arg)
总是使用这个宏定义会不会很方便?
void f(vector<T>&& a)
{
some_func(FWD(a));
}
这两种写法完全等价,不是吗?
move()
更方便这一观点存在问题,但我认为这是基于个人看法的问题。两种方法的效果相同。 - Barry