小编Bla*_*bot的帖子

pass-by-value和std :: move优于pass-by-reference

我正在学习C++,并试着避免养成坏习惯.根据我的理解,clang-tidy包含许多"最佳实践",我尽可能地尽可能地坚持它们(即使我不一定理解为什么它们被认为是好的),但我不确定我是否了解这里推荐的内容.

我在教程中使用了这个类:

class Creature
{
private:
    std::string m_name;

public:
    Creature(const std::string &name)
            :  m_name{name}
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

这导致了一个讽刺的建议,即我应该通过值而不是引用和使用std::move.如果我这样做,我得到的建议做出name的引用(以确保它不会被复制每次),并警告说std::move将不会有任何影响,因为nameconst这样,我应该将其删除.

我没有得到警告的唯一方法是const完全删除:

Creature(std::string name)
        :  m_name{std::move(name)}
{
}
Run Code Online (Sandbox Code Playgroud)

这似乎是合乎逻辑的,因为唯一的好处const是防止弄乱原始字符串(这不会因为我通过值传递而发生).但我在CPlusPlus.com看到了:

虽然注意到-in标准库移动意味着移动的对象保持有效但未指定的状态.这意味着,在这样的操作之后,移动对象的值应该只被销毁或分配一个新值; 访问它否则会产生一个未指定的值.

现在想象一下这段代码

std::string nameString("Alex");
Creature c(nameString);
Run Code Online (Sandbox Code Playgroud)

因为nameString通过值传递,std::move只会name在构造函数内部无效而不会触及原始字符串.但这有什么好处?看起来无论如何内容只被复制一次 - 如果我在调用时通过引用传递m_name{name},如果我在传递它时传递值(然后它被移动).我知道这比通过值而不是使用std::move(因为它被复制两次)更好.

所以有两个问题:

  1. 我是否正确理解这里发生了什么?
  2. 使用std::move过度引用和调用是否有任何好处m_name{name}

c++

81
推荐指数
2
解决办法
1万
查看次数

标签 统计

c++ ×1