显式复制构造函数或隐式参数值

R S*_*hko 6 c++ parameters optimization operators conversion-operator

我最近阅读(并且遗憾地忘记了在哪里),编写operator =的最佳方法是这样的:

foo &operator=(foo other)
{
    swap(*this, other);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

foo &operator=(const foo &other)
{
    foo copy(other);
    swap(*this, copy);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是,如果使用rvalue调用operator =,则第一个版本可以优化复制的构造.因此,当使用rvalue调用时,第一个版本更快,当使用左值调用时,这两个版本是等效的.

我很好奇其他人对此的看法?由于缺乏明确性,人们会避免使用第一个版本吗?我是否正确,第一个版本可以更好,永远不会更糟?

jam*_*lin 4

您可能从以下位置阅读:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

我没什么可说的,因为我认为该链接很好地解释了原理。有趣的是,我可以确认第一种形式会导致我使用 MSVC 构建的副本较少,这是有道理的,因为编译器可能无法对第二种形式进行复制消除。我同意第一种形式是严格的改进,并且绝不会比第二种更差。

编辑:第一种形式可能不太惯用,但我认为它并不太不清楚。(IMO,这并不比第一次看到赋值运算符的复制和交换实现更令人惊讶。)

编辑 #2:哎呀,我的意思是写复制省略,而不是 RVO。