c++98中的move()是什么?
#include <iostream>
#include <vector>
using namespace std;
int main(void){
vector<int> a;
a.push_back(3);
vector<int> b = move(a);
cout<<"b: "<<b.data()<<endl;
cout<<"a: "<<a.data()<<endl;
return 0;
}
输出(在 c++98 中):
#include <iostream>
#include <vector>
using namespace std;
int main(void){
vector<int> a;
a.push_back(3);
vector<int> b = move(a);
cout<<"b: "<<b.data()<<endl;
cout<<"a: "<<a.data()<<endl;
return 0;
}
输出(在 C++11 中):
b: 0x7f9a82405730
a: 0x7f9a82405720
我正在使用 Apple clang 11.0.3。
第一个输出不使用编译器标志。
-std=c++11 第二个输出的标志。
我知道 move() 在 c++11(和更高版本)中做什么。但是正如我所看到的,在 c++98 中使用 move() 对传递的对象没有任何作用,只会发生深拷贝。
那为什么 c++98 中有 move() 呢??
回答
您完全可以调用std::moveC++11 之前的原因是 libc++ 没有将它的实现包装在#if _LIBCPP_STD_VER >= 11. 这在 libstdc++(Linux 默认使用)中不起作用,因为它std::move使用#if __cplusplus >= 201103L.
至于为什么使用它不会makea.data()为空,是因为libc++确实将移动构造函数包装在了 中#ifndef _LIBCPP_CXX03_LANG,所以它回落到了复制构造函数。