当变量和参数名称匹配时,移动语义构造失败

Move semantics construction failure when variable and parameter names match

本文关键字:移动 语义 失败 变量 参数      更新时间:2023-10-16

以下是有问题的完整代码;注释显示了输出。

显然,即使最初缺少变量,变量也会在Class1中设置。Class2显示了将形式参数的名称更改为与成员变量不同的名称如何提供帮助。

#include <iostream>
using namespace std;
class Class1
{ 
public:
string name;
Class1(string name):name(move(name)) { cout << name << endl; } // NULL ???
~Class1() { cout << name << endl; }  // foo
};

class Class2
{ 
public:
string name;
Class2(string s):name(move(s)) { cout << name << endl; } // bar
~Class2() { cout << name << endl; }  // bar
};

int main(void)
{ Class1 x("foo");
Class2 y("bar");
}

参数隐藏成员变量。这是预期行为。您可以通过以下方式修复它:

Class1(string name):name(move(name)) {
cout << "argument: " << name << endl; // NULL
cout << "member: " << this->name << endl; // foo
}

这与移动无关。尝试:

Class1(string name):name("member"+name)) {
cout << "argument: " << name << endl; // foo
cout << "member: " << this->name << endl; // memberfoo
}

Class1中,您正在打印构造函数参数。在Class2中,您正在打印类成员。要在Class1中打印类成员,必须使用this,因为参数名称隐藏成员名称:

Class1(string name):name(move(name)) { cout << this->name << endl; }