c – 我应该通过rvalue引用返回一个rvalue引用参数吗?

我有一个函数修改std :: string& lpue引用就地,返回对输入参数的引用:

std::string& transform(std::string& input)
{
    // transform the input string
    ...

    return input;
}

我有一个帮助函数,允许在rvalue引用上执行相同的内联转换:

std::string&& transform(std::string&& input)
{
    return std::move(transform(input)); // calls the lvalue reference version
}

请注意,它返回一个右值引用。

我已经阅读了关于返回值参考的几个问题(例如herehere),并得出结论,这是不好的做法。

从我所看到的,似乎共识是,由于回报价值是价值,加上考虑到RVO,只是按价值返回将是有效的:

std::string transform(std::string&& input)
{
    return transform(input); // calls the lvalue reference version
}

但是,我也读到返回的功能参数阻止RVO优化(例如herehere)

这使我相信一个副本会发生在std :: string&将transform(…)的lvalue引用版本的值返回到std :: string返回值。

那是对的吗?

最好保持我的std :: string&&&转换(…)版本?

没有正确的答案,但价值的回报更安全。

I have read several questions on SO relating to returning rvalue references, and have come to the conclusion that this is bad practice.

返回一个对参数的引用,使得呼叫者的合同也可以

>该参数不能是临时的(这是rvalue引用代表什么),或者
>返回值不会保留在调用者上下文中的下一个分号(当临时摧毁时)。

如果主叫方临时通过,并尝试保存结果,它们将获得悬挂的引用。

From what I have read, it seems the consensus is that since return values are rvalues, plus taking into account the RVO, just returning by value would be as efficient:

按值返回增加移动施工操作。这个成本通常与物体的大小成正比。而通过引用返回只需要机器来确保一个地址在寄存器中,返回值需要在参数std :: string中调用几个指针,并将它们的值放在一个新的std :: string中才能返回。

它很便宜,但是非零。

标准库目前采取的方向有些令人惊讶,是快速和不安全的,并返回参考。 (唯一的功能,我知道实际上这是std :: get from< tuple&gt ;.)正如我们所说,我已经向C核心语言委员会提交了a proposal来解决这个问题,a revision是在作品中,就在今天我开始调查实施。但它是复杂的,而不是一个确定的事情。

06000

编译器不会在这里产生一个动作。如果输入完全不是引用,并且您返回输入;但是,没有理由相信转换将返回输入,因为它是一个参数,它不会推导出rvalue引用类型的所有权。 (见C 14§12.8/ 31-32。)

你需要做:

return std::move( transform( input ) );

或等效地

transform( input );
return std::move( input );
http://stackoverflow.com/questions/30094067/should-i-return-an-rvalue-reference-parameter-by-rvalue-reference

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 我应该通过rvalue引用返回一个rvalue引用参数吗?