关于移动const对象

时间:2014-08-09 12:09:33

标签: c++ c++11 move-semantics

我知道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_referenceremove_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);
}

1 个答案:

答案 0 :(得分:1)

要删除对象的常量,要使用的强制转换为const_cast而不是static_cast

你想要这样的东西:

template<typename T>
T&& my_move(const T& t) noexcept {
    return std::move(const_cast<T&>(t));
}

(从对象中移除const可能存在问题)...

Live example