我知道 std::move
const 对象实际上会调用 T
的复制构造函数,
所以我想做一些实验来实现我的 move 和这个删除的内部以删除 const
例如:
template<typename _Tp>
typename std::remove_const<typename std::remove_reference<_Tp>::type>::type&&
my_move(_Tp&& __t) noexcept {
using removed_reference = typename std::remove_reference<_Tp>::type;
using removed_ref_const = typename std::remove_const<removed_reference>::type;
return static_cast<removed_ref_const&&>(__t);
}
但是这段代码无法编译?为什么
如果我改变 remove_reference
和 remove_const
的顺序,这段代码将编译但不是我期望的那样,my_move(const Object T)
仍然使用 Object T
的复制构造函数吗?
还有谁能给我一个正确的实现,它会在我删除 const
时显示,这将使用 T
的 move 构造函数。
T 可能是:
struct T
{
T() = default;
T(const T&) { std::cout << "copy ctor\n"; }
T(T&&) { std::cout << "move ctor\n"; }
};
int main() {
const T t;
T a = my_move(t);
}
最佳答案
要移除对象的常量性,要使用的转换是 const_cast
而不是 static_cast
你想要这样的东西吗:
template<typename T>
T&& my_move(const T& t) noexcept {
return std::move(const_cast<T&>(t));
}
(从对象中删除 const
可能会出现问题)...
关于c++ - 关于 move 一个 const 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218420/