C++ 11 std::move(x)函数根本不会移动任何东西.它只是一个转换为r值.为什么这样做?这不是误导吗?
这个程序:
#include <iostream>
struct T {
T() {}
T(const T &) { std::cout << "copy constructor "; }
T(T &&) { std::cout << "move constructor "; }
};
int main() {
([](T t) -> T { return t; })({}); std::cout << '\n';
([](T t) -> T { return void(), t; })({}); std::cout << '\n';
([](T t) -> T { return void(), std::move(t); })({}); std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)
当由gcc-4.7.1输出编译时(链接):
move constructor
copy constructor
move constructor
Run Code Online (Sandbox Code Playgroud)
为什么逗号运算符有这种效果?标准说:
5.18逗号运算符[expr.comma]
1 - …
刚读完Stroustrup的C++编程语言第4版,他在第7章中说:
move(x)表示static_cast<X&&>(x)X是x的类型
和
由于move(x)不移动x(它只是产生对x的rvalue引用),如果move()被称为rval()则会更好
我的问题是,如果move()只是将变量转换为rval,那么实现对变量的引用"移动"的实际机制是什么(通过更新指针)?
我认为move()就像一个移动构造函数,除了客户端可以使用move()来强制编译器?