rvalue参数引起的多种实现

时间:2018-12-05 08:21:49

标签: c++ move

这是我的测试代码:

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<int> &&)不会被专门呼叫吗?

1 个答案:

答案 0 :(得分:3)

这与右值或移动不直接相关。左值引用重载也会发生同样的情况

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则会产生两个等效的转换序列。

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