【问题标题】:Multiple implementation caused by rvalue parameter右值参数导致的多重实现
【发布时间】:2018-12-05 16:38:40
【问题描述】:

这是我的测试代码:

void test(std::vector<int> vec){};
void test(std::vector<int> && vec){};

int main(int argc, char * argv[])
{
    std::vector<int> v;
    test(v);
    test(std::move(v));

    return 0;
}

当我尝试调用test(std::move(v)) 时,我被告知test 是多重实现的。显然,我使用 std::move 使 v 成为右值。不会专门调用test(std::vector&lt;int&gt; &amp;&amp;)吗?

【问题讨论】:

  • “多重实现”是什么意思?为什么不通过在两个重载中打印不同的内容来尝试一下呢?
  • @Nelfeal 在函数中打印某些内容不会改变编译时错误:ideone.com/6X3Uhf
  • @mch 好点。我没有立即看到 OP 的问题是什么,因为没有任何迹象。

标签: c++ move


【解决方案1】:

这与右值或移动没有直接关系。左值引用重载也是如此

void test(std::vector<int> vec){};
void test(std::vector<int> & vec){};

int main(int argc, char * argv[])
{
    std::vector<int> v;
    test(v); // ambiguous

    return 0;
}

两个重载的隐式转换序列是等价的。您的示例仅在移动时突然爆发的原因是第一个调用传递了一个左值(使第二个重载不适用),而再次应用 std::move 会产生两个等效的转换序列。

按值接受参数意味着该参数可以通过移动或复制来初始化。因此,如果您在引用上有另一个重载(无论是右值还是左值),那么该值类别就会有歧义。

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多