C++ 变量名和参数名匹配时移动语义构造失败

C++ 变量名和参数名匹配时移动语义构造失败,c++,constructor,move,C++,Constructor,Move,以下是有关的完整代码;注释显示输出 显然,变量设置在Class1中,即使最初缺少Class2显示了将形式参数的名称更改为与成员变量不同的名称有何帮助 #include <iostream> using namespace std; class Class1 { public: string name; Class1(string name):name(move(name)) { cout << name << endl; } // N

以下是有关的完整代码;注释显示输出

显然,变量设置在
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");
  }
#包括
使用名称空间std;
一班
{ 
公众:
字符串名;

Class1(字符串名称):name(move(name)){cout参数会隐藏成员变量。这是预期的行为。您可以使用以下方法修复它:

Class1(string name):name(move(name)) {
    cout << "argument: " << name << endl; // NULL
    cout << "member: " << this->name << endl; // foo
}
Class1(字符串名称):名称(移动(名称)){

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

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

Class1(字符串名称):name(move(name)){cout name有什么问题吗?试试
Class1(字符串名称):name(move(name)){cout name您的参数和您的成员变量的名称相同。在
Class1
的构造函数中,您正在打印一个已移动而不是成员的局部变量。如果标准库include
#include
用于
string
#include
用于
移动
,您还缺少标准库include
没有它们,这纯粹是巧合。技术上的错误。一个参数是调用方传入的内容,参数是参数列表中指定的变量。
cout@Eljay准确性在编程中很重要。不幸的是,我经常混淆它们。你、我和许多其他人也一样。这个特殊的错误最终进入了我的大脑。13年的c如果没有std::move,它可以正常工作,但是:class Class3{public:string name;class Class3(string name):name(name){cout@Qaligula如果不移动参数,参数就不会为空。您仍然在打印参数,而不是成员。
Class1(string name):name(move(name)) { cout << this->name << endl; }