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; }