【问题标题】:Why std::move when type is already of the type T&&为什么当类型已经是类型 T&& 时 std::move
【发布时间】:2014-03-15 17:23:45
【问题描述】:

我今天在人们的回答中看到了几个地方,说我有 Foo 的构造函数。

Foo(      std::vector<SomeType>&& data) noexcept : data_(std::move(data)) {};

为什么 std::move(data) 是必需的,因为数据类型不是 std::vector&& ?

std::move 在我看来,它只是将数据再次转换为 std::vector&& ?

http://en.cppreference.com/w/cpp/utility/move 将 std::move 定义为,

static_cast<typename std::remove_reference<T>::type&&>(t)

因此,在这种情况下,似乎 std::move 再次无关紧要,但我可能遗漏了一些东西。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    在这两种情况下,

    void foo(const T& bar); // 1
    void foo(T&& bar);      // 2
    

    bar 实际上是一个lvalue&amp;&amp; 的意思是重载 2 将绑定到右值,例如在以下情况下:

    foo(Bar());
    

    而重载1 会在此处绑定:

    T bar;
    foo(bar);
    

    2 中,您仍然需要使用std::move 使bar 在函数内部看起来和行为类似于rvalue

    【讨论】:

    • 我明白了。我猜这是因为命名的右值引用仍然是左值。这篇文章彻底解释了它。 thbecker.net/articles/rvalue_references/section_05.html#no_name > 被声明为右值引用的事物可以是左值或右值。区分标准是:如果它有名字,那么它就是一个左值。否则,它是一个右值。
    • @capturesteve 是的,就是这样。而std::move主要是隐藏名字的伎俩。
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2023-03-21
    相关资源
    最近更新 更多