当变量和参数名称匹配时,移动语义构造失败
Move semantics construction failure when variable and parameter names match
以下是有问题的完整代码;注释显示了输出。
显然,即使最初缺少变量,变量也会在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; }
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 移动语义和深层/浅层复制之间有什么关系?
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 复制省略并在返回值中移动语义
- std::元组和移动语义
- 移动语义与返回shared_ptr?
- C++具有移动语义的可变参数工厂会导致运行时崩溃