【问题标题】:Move semantics for lvalue左值的移动语义
【发布时间】:2017-06-01 12:38:07
【问题描述】:

我做了简单的测试来更好地理解移动语义。输出结果出乎我的意料。波纹管是我的测试功能:

template<class T>
void test(T&& v)
{
    v++;
}

void main()
{
    int v = 1;
    test(std::move(v));
    std::cout << "Output:" << v << std::endl;
}

我的期望是: 输出:1 但真正的结果是: 输出:2

我的想法如下 - 我使用 std::move(v),结果我转换为“右值”并且测试函数将使用时间变量。因此结果应该是输出:1。 我的结论有什么问题?

【问题讨论】:

  • void main 不符合 c++ 标准。
  • std::move 的名字选错了,这可能是让你感到困惑的地方。它实际上并没有移动任何东西。它只是将左值转换为右值,从而可能进行移动。

标签: c++ std move-semantics rvalue


【解决方案1】:

std::move 从不构造临时对象。它是对右值引用的转换。

这个引用绑定到main::v,然后test::v参数用它初始化,因此也绑定到main::v

如果你想创建一个临时的,使用演员表:

test(int{v});

【讨论】:

    【解决方案2】:

    为了帮助您了解您的模板推导出的类型,您可以使用宏__PRETTY_FUNCTION__

    template<class T>
    void test(T&& v)
    {
        std::cout<< __PRETTY_FUNCTION__ << std::endl;
        v++;
    }
    

    这家伙还解释了很多关于模板推导的事情(你的案例在 35')

    https://www.youtube.com/watch?v=vwrXHznaYLA

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2013-02-14
      • 2013-08-25
      • 2016-07-11
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多