静态演员的描述说
如果new_type是右值引用类型,则static_cast将expression的值转换为xvalue。这种类型的static_cast用于在std :: move中实现移动语义。(自C ++ 11起)
这是否证实以下内容相同?
(一个)
X x1;
X x2 = static_cast<X&&>(x1);
(B)
X x1;
X x2 = std::move(x1);
是的,有一个非常重要的区别:std::move
记录了你想做的事情。此外,演员很容易写错误,如遗忘的&
或错误的类型X
。
可以看出,std::move
甚至更少打字。
T &&在C ++ 11中是rValue参考。它们的行为类似于C ++ 98,03中的左值引用。他们的目标 - 成为移动的候选人。在C ++ 98中,这样的构造可以出现在refrence崩溃中
std :: move - 在rvalue中转换表达式。它可以被称为rvalue_cast,但这样的关键字不存在。
显式强制转换为T &&原则上可行。真正的标准花费了一些钱,但在ISO/IEC 14882:2011的草案中存在这样的信息
5.2.9静态铸造
8)
左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)转换应用于操作数....
从实际的角度来看,使用std :: move更方便。想象一下这样的例子:
#include <stdio.h>
#include <utility>
class A
{
public:
A () {printf ("A ()" "\n");}
A (const A &) {printf ("A (&)" "\n");}
A (A &&) {printf ("A (&&)" "\n");}
A (const A &&) {printf ("A (const &&)" "\n");}
~ A () {printf ("~ A ()" "\n");}
};
int main ()
{
const A obj;
A obj2 (std::move (obj)); // 1-st approach
A obj3 (static_cast <const A&&> (obj)); // 2-nd approach
}
至于我的第一种方法是
当a是右值时,你可以使用static_cast<A &&>(a)
,但你不应该使用std::move(a)
。
当你使用A && a = std::move(A())
时,你会得到一个悬空参考。
基本思想是临时的生命周期不能通过“传递”来进一步扩展:从临时绑定的引用初始化的第二个引用不会影响其生命周期。
std::move
的实施有点像
template <typename T>
constexpr decltype(auto) move(T && __t) noexcept // when used in std::move(A()),
// the lifetime of the temporary object is extended by __t
{
return static_cast<typename std::remove_reference<T>::type &&>(__t); // a xvalue returned, no lifetime extension
}
auto && a = std::move(A()); // the anonymous object wiil be destructed right after this line