我有一个函数调用
class MyClass {
static std::string getName(void) {
return getMyName(void); // Returning by value as well
}
};
现在,如果我在类的构造函数中使用这个函数
class AnotherClass {
public:
AnotherClass(void) :
m_name(std::move(MyClass::getName())) {} // 1. std::move used
const std::string& name(void) const { // 2. Should I use std::string&& (without consts)
// .... but I also need to make sure value cannot be changed (e.g, name() = "blah";)
// if std::string&& will be used should I use it simply by calling name() to call function using move or should I leave it as is?
return m_name;
}
private:
std::string m_name;
}
这是移动语义的正确用法吗?如何确保函数使用移动语义?
我正在努力学习通过移动语义来实现效率,所以如果这是一个愚蠢的问题,请道歉。
我已检查
什么是移动语义?
http://www.cprogramming.com/c++11/r价值参考和移动需求-in-c++11.html
这是C++的正确用法吗;移动';语义?
这是一个很好的解释,但需要对确保if函数使用move语义进行说明。
此处无需使用std::move
:
m_name(std::move(MyClass::getName())) {} // no need to use std::move
getName()
返回一个副本,该副本已经是一个右值。
就像你通常会做的那样:
m_name(MyClass::getName()) {}
如果需要的话,move构造函数将自动使用。(编译器可以完全省略副本,并将MyClass::getName()
的返回值直接构造到m_name
中,这甚至更好)。
对此:
const std::string& name() const { return m_name; }
这里也没必要做什么特别的事。您不希望更改m_name
,因此不应该使用std::move
,而应该使用常规的const lvalue引用。
需要std::move
的最常见情况是在创建自己的移动构造函数时:
class AnotherClass {
public:
AnotherClass(AnotherClass &&that) :
m_name(std::move(that.m_name))
{
}
};
这是因为即使that
被声明为右值引用,但在构造函数内部,that
的行为类似于常规的左值引用。