我知道std::move
const对象实际上会调用T
的复制构造函数,
所以我想做一些实现我的移动的实验,并在此删除内部移除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)
仍然使用对象T
的复制构造函数?
还有谁可以给我一个正确的实现,当我删除const
时会显示,这将使用T
的移动构造函数。
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);
}
答案 0 :(得分:1)
要删除对象的常量,要使用的强制转换为const_cast
而不是static_cast
你想要这样的东西:
template<typename T>
T&& my_move(const T& t) noexcept {
return std::move(const_cast<T&>(t));
}
(从对象中移除const
可能存在问题)...