我看了std::move函数的源代码。它所做的是删除引用并添加一个正确的引用(&&)。
/**
* @brief Convert a value to an rvalue.
* @param __t A thing of arbitrary type.
* @return The parameter cast to an rvalue-reference to allow moving it.
*/
template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }所以,我想知道我能不能做一个正确的引用并把它传递给函数?所以,这里是:
void f1(int&&) { std::cout << 1; }
void f1(int&) { std::cout << 2; }
int main() {
int&& x = 1;
f1(static_cast<decltype(x)>(x));
f1(static_cast<int&&>(x));
f1(x);
}产出: 112
我发现x是int的类型&因为前两个f1做同样的事情。但是,第三个呢?这不是一个整数吗?为什么我必须static_cast它才能像正确的引用一样使用它?我知道在"c++模板完整指南“中有一个clam,即:
移动语义不是自动传递的这一事实是有意的,也是重要的。如果不是这样的话,当我们第一次在函数中使用它时,我们就会失去可移动物体的价值。
我仍然好奇他们为什么在编译时选择不同的函数,即使他们有相同的类型?
发布于 2018-07-19 11:43:45
你混淆了类型和价值范畴,它们是不同的东西。
作为一个命名变量,x的值类别是lvalue,(它的类型是int&&。)lvalue可以绑定到lvalue-引用,但不能绑定到rvalue-引用。因此,给定f1(x);,将选择f1(int&)。
要使f1(int&&)被调用,您需要将它转换为rvalue。第一个和第二个选择f1(int&&),因为显式转换使rvalue表达式(更确切地说是xvalue表达式);可以绑定到rvalue-引用。std::move也以类似的方式工作。
以下表达式为xvalue表达式:
std::move(x))的rvalue引用;static_cast<char&&>(x))的引用进行转换的表达式;https://stackoverflow.com/questions/51421707
复制相似问题