假设我有这段代码
template <typename T> void Swap(T&& a, T&& b) {
T tmp = std::move(a);
a = std::move(b);
b = std::move(tmp);
}
int main()
{
int a = 2;
int b = 3;
}
根据我对这个讲座的理解,在调用Swap(a, b)
时,编译器应该推断出T&&
应该是T&
并进行转换。但在这种情况下,GCC会给我以下错误:
error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'std::remove_reference<int&>::type {aka int}'
T tmp = std::move(a);
我要么使用
Swap(std::forward<int>(a), std::forward<int>(b))
或者Swap(std::move(a), std::move(b))
来调用Swap
,要么将Swap
的签名替换为Swap(T& a, T& b)
。为什么会这样?这里应该如何正确使用?
T&&
应该是T&
,所以第一行应该是T& tmp = std::move(a);
。这是无意义的,因为你不能将一个右值绑定到非 const 的左值引用上。你似乎知道这一点,所以我不明白你实际的问题是什么... - ildjarnSwap(1 + 2, 2 + 1)
...?像std::exchange
这样的东西可能会更有价值一些。 - Kerrek SBSwap(int&, int&)
的调用替换为Swap(int& &&, int& &&)
,从而导致T == int
,而不是T
然后导致T
成为int&
。在这种情况下,错误是完全合理的。 - cmourglia