c++ - 关于 move 一个 const 对象

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

我知道 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_referenceremove_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 可能会出现问题)...

Live example

关于c++ - 关于 move 一个 const 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25218420/

相关文章:

c++ - "auto function()"可以在函数体内有几种类型的返回吗?

c++ - 带有 CMake 的 CLion 中的 GLFW3 库导致 MacOS 上出现 undefined symbol

c++ - 如何在多个 QListView 上只获得一个选择?

c++ - 尽管按名称返回,为什么仍复制局部变量?

c++ - std::set::equal_range 用于 std::pair 的容器

c++ - 试图更好地理解 std::forward、std::move

c++ - 为 POD-ish 类型 move 语义

c++ - 从不可 move 对象的函数返回拷贝

c++ - 如何跟踪导致应用程序挂起的代码

c++ - 是否可以在模板类中编写一个静态可变参数模板函数,该函数可以采用 T 类型的 N 个参数?