C++11 c++;11:如何理解函数move

C++11 c++;11:如何理解函数move,c++11,move,C++11,Move,我无法理解c++11中的函数move 从中,我得到了以下信息: 尽管请注意,在标准库中,移动意味着 “从对象移动”处于有效但未指定的状态。哪个 意味着,在这样一个操作之后,的值从 只能销毁对象或为其指定新值;访问它 否则将产生一个未指定的值 在我看来,在move()之后,从对象移动的对象已经“清除”。但是,我做了以下测试: std::string str = "abcd"; std::move(str); std::cout<<str; 我现在很困惑。如果函数move将清除对象,参

我无法理解c++11中的函数move

从中,我得到了以下信息:

尽管请注意,在标准库中,移动意味着 “从对象移动”处于有效但未指定的状态。哪个 意味着,在这样一个操作之后,的值从 只能销毁对象或为其指定新值;访问它 否则将产生一个未指定的值

在我看来,在move()之后,从对象移动的对象已经“清除”。但是,我做了以下测试:

std::string str = "abcd";
std::move(str);
std::cout<<str;

我现在很困惑。如果函数
move
将清除对象,参数
d
将被清除,我们如何“使用d来初始化d的成员”

std::move
实际上没有做任何事情。它大致类似于强制转换表达式,因为返回值是原始对象,但处理方式不同

更准确地说,
std::move
以一种形式返回对象,这种形式可以使其资源出于其他目的被“窃取”。原始对象或多或少仍然有效(您只需要对其执行某些特殊操作,尽管这主要是惯例问题,不一定适用于非标准库对象),但被盗的资源不再属于它,通常不再被它引用


但是<代码>标准::移动本身并不会进行偷窃。它只是为允许偷窃设置了条件。因为你没有做任何有结果的事情,更不用说可以利用这个机会的事情了,所以没有东西会被偷走。

std::move不会移动任何东西。move只是一个执行强制转换的函数模板。std::move无条件地将其参数强制转换为右值

std::move(str);
使用这个表达式,您只需执行从左值到右值的类型转换

对程序进行小的修改,以便更好地理解

 std::string str = "abcd";
 std::string str1 = std::move(str);
 std::cout<<str<<std::endl;
 std::cout<<str1<<std::endl; 
将std::move应用于对象会告诉编译器该对象符合从中移动的条件。它向右转

class Base{/* ... */};
class D: public Base{
public:
    D(D&& d): Base(std::move(d)){/* use d to initialize the members of D */}
};
Base(std::move(d))
它将只执行向上转换,只移动基类部分


这里还有一件有趣的事情要向你学习。如果您不使用
std::move
调用基类析构函数,比如
D(D&&D):base(D)
,那么D将被视为所涉及基类的左值和复制构造函数,而不是move构造函数。有关更多详细信息,请参阅

您很幸运。或者不幸,取决于你的观点。
template<typename T> // C++14; still in
decltype(auto) move(T&& param) // namespace std
{
using ReturnType = remove_reference_t<T>&&;
return static_cast<ReturnType>(param);
}
class Base{/* ... */};
class D: public Base{
public:
    D(D&& d): Base(std::move(d)){/* use d to initialize the members of D */}
};