【发布时间】:2019-09-16 08:08:59
【问题描述】:
假设我有一个班级ThisHasAStringMember。假设它有一个私有成员,它是一个字符串,我想有效地获取字符串值,在可能的情况下更喜欢移动而不是副本。下面的两个构造函数能做到吗?
class ThisHasAStringMember
{
public:
// ctors
ThisHasAStringMember(const std::string str) : m_str(str) {}
ThisHasAStringMember(std::string &&str) : m_str(std::move(str)) {}
// getter (no setter)
std::string value() { return m_str; }
private:
std::string m_str;
}
在第二个构造函数中,str 参数之前是否需要双 & 号?
这是实现此目的的正确方法吗?
【问题讨论】:
-
如果你有 1 小时的时间,试试这个 CPPCON 视频^^。 youtube.com/watch?v=PNRju6_yn3o 。 TLDR : 就价值而言非常好(不是完美但很好)
-
Move 无论如何都会被任何体面的现代编译器选择。您不需要那个显式的构造函数声明。顺便说一句,我已经看到了您的最后一个问题,您不应该对这些事情束手无策。您可以确信现代编译器会尽可能高效地完成这些工作。
-
如果它应该是有效的..你确定要返回字符串对象的副本而不是对它的引用吗?
-
@MartinMorterol 我没有花整个小时,而是 30 分钟。如果没有时间 10 分钟就足以注意到大多数问题都来自没有显式构造函数。
标签: c++ c++11 constructor move