【发布时间】:2020-12-15 18:31:00
【问题描述】:
假设我们有一个简单的类
struct MyClass {
const std::string &getString() const & {
return m_string;
}
std::string getString() && {
return std::move(m_string);
}
private:
std::string m_string;
};
正如我们所看到的,m_string 在我们无法修改它的意义上充当非可变变量。
这个结构还保留了这样一个事实:如果我们将MyClass 的一个实例移动到另一个实例,m_string 属性也会被移动。
现在,我们将尝试重构之前的结构:
struct MyClass {
std::string m_string;
};
在这里,我们保留了可以访问或移动它的事实,但是我们失去了“不变性”......所以我试着这样写:
struct MyClass {
const std::string m_string;
};
这里我们得到了不变性,但是,当我们移动对象时,我们失去了潜在的优化......
那么,是否有可能在不编写所有 getter 的情况下具有类似于第一个代码的行为?
编辑:std::string 只是一个例子,但这个想法必须适用于所有类型的对象
【问题讨论】:
-
它是一个指针和一个大小,它会花费一点,但我可能会使用一个返回
std::string_view的 getter,比如struct MyClass { std::string_view getString(){ return m_string; } private: std::string m_string; }; -
@NathanOliver 感谢您的回答,但
std::string示例只是示例,我想要一个“通用”解决方案:)。我编辑了这个问题,因为它不清楚。 -
也许您可以编写一个带有隐式转换运算符的包装器,一个用于右值引用,一个用于左值引用。然后你可以使用包装器作为成员,例如
my_moveable<std::string> m_string;。 -
@TedLyngmo 我正在尝试开发一个小库,因此,有时,我希望有这样的行为。但这更多是为了好奇:)
-
getString() &&重载仅在fnReturningMyClass().getString()和std::move(myClassObj).getString()等情况下被调用。你真的需要这种行为吗?它应该与将一个MyClass实例移动到另一个无关。相反,它用于窃取临时/生命终止MyClass实例的内容以用于其他目的。