c++98 中的 move() 是什么?
What is move() in 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++98 中):
b: 0x7f9a82405730
a: 0x7f9a82405720
输出(在 c++11 中):
b: 0x7f9a82405730
a: 0x0
我正在使用 Apple clang 11.0.3。
第一个输出没有使用编译器标志。
-std=c++11
第二个输出的标志。
我知道 c++11(及更高版本)中 move() 的作用。
但是正如我所看到的,在 c++98 中使用 move() 对传递的对象没有任何作用,只是发生了深度复制。
那为什么c++98里有move()??
你可以在所有 C++11 之前调用 std::move
的原因是 libc++ 不包装 its implementation of it in #if _LIBCPP_STD_VER >= 11
. This doesn't work in libstdc++ (which Linux uses by default) because it guards std::move
with #if __cplusplus >= 201103L
.
至于为什么使用它不会使a.data()
为null,是因为libc++does wrap the move constructor in #ifndef _LIBCPP_CXX03_LANG
,所以它回落到复制构造函数。
#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 中):
b: 0x7f9a82405730
a: 0x7f9a82405720
输出(在 c++11 中):
b: 0x7f9a82405730
a: 0x0
我正在使用 Apple clang 11.0.3。
第一个输出没有使用编译器标志。
-std=c++11
第二个输出的标志。
我知道 c++11(及更高版本)中 move() 的作用。 但是正如我所看到的,在 c++98 中使用 move() 对传递的对象没有任何作用,只是发生了深度复制。
那为什么c++98里有move()??
你可以在所有 C++11 之前调用 std::move
的原因是 libc++ 不包装 its implementation of it in #if _LIBCPP_STD_VER >= 11
. This doesn't work in libstdc++ (which Linux uses by default) because it guards std::move
with #if __cplusplus >= 201103L
.
至于为什么使用它不会使a.data()
为null,是因为libc++does wrap the move constructor in #ifndef _LIBCPP_CXX03_LANG
,所以它回落到复制构造函数。