我应该总是在构造函数中使用 std::move 吗?

Dus*_*ger 6 c++ move-semantics c++11

示例 A 中使用的移动语义是否必要,哪个结构更好?

示例 A:

struct A
{
    std::string a;
    A( std::string a ) : a( std::move(a) ){ }
};
Run Code Online (Sandbox Code Playgroud)

示例 B:

struct B
{
    std::string b;
    B( const std::string& b ) : b( b ){ }
};
Run Code Online (Sandbox Code Playgroud)

我不相信这是一个重复的问题。我特别询问从在类构造函数中使用成员初始化的角度来看,哪个示例更好。另一个问题中列出的示例或答案均未涉及成员初始化。

我不喜欢使用引用参数调用构造函数,然后将其复制到成员中。似乎有多个复制操作可能很浪费。

我想尽可能有效地将数据“管道”到成员中,但我不想将右值作为构造函数参数。

Pav*_*aka 1

在我看来,将两者进行比较是不真实的。

大多数时候,实现的复制构造函数会进行深度复制,其背后的主要目的是确保源对象不被修改

std::move 最终调用右值引用的移动构造函数,仅复制指针并可以将源对象指针设置为 NULL。这种场景主要针对临时对象

因此,这两个示例都有两个不同的目的一个(复制构造函数)当您希望源对象不受影响时,另一个 std::move)用于处理临时对象。

  • 但是在 `std::move` 情况下参数是按值传递的,因此 `std::string` 的复制构造函数用于创建一个临时对象,然后将其移动到成员变量中 - 至此为止我可以看出,这两种情况是等效的,选择哪一种只是风格问题。 (4认同)