假设我有一个类,其内部数据表示例如是std::string
:
class my_type {
std::string m_value;
...
};
如果我可以“移出”my_type
的内部表示,那会没关系吗?这样的能力将以如下方式完成:
class my_type {
std::string m_value;
public:
operator std::string() && {
// NOTE: ^^ ref qualifier for r-value
return std::move(m_value);
// Explicitly do std::move is used because ref-qualifiers don't apply
// to data members (m_value would still be an l-value), and (N)RVO
// would be crazy for the compiler to apply here.
}
};
...
my_type val;
std::string str1 = std::move(val);
std::string str2 = a_func_that_returns_my_type();
具体问题:
将内部代表移出BadIdea™? (例如泄漏实施?)
我是否滥用(隐式)转换运算符?如果是这样,我应该使用明确的吗?例如:
std::string str = std::move(val).get_str(); // Or auto instead of explicit std::string
// Is this a GoodIdea™?
或
auto str = val.move_str_out();
如果l值存在转换运算符/函数,我是否应该只定义它?
我在这里想要实现的是不成熟的优化吗?
有关背景信息,请参阅:
&&
ref-qualifer)答案 0 :(得分:3)
将内部代表移出BadIdea™?
我在我的文本类中使用了一个类似的想法作为转义填充,允许用户对性能或其他任何原因执行基础字节的自由操作,而不会不断地强制执行文本类的不变量。这基本上允许您在第2步执行具有中间结果的事情,这些结果会违反类的不变量而不会实际违反它们。然而,将表示重新放入必须再次强制执行不变量。
这些语义对我来说很好,因为我的类明确地表示为特定表示的不变执行器。
所以我不会说这是BadIdea™。只要该成员处于一个服从该类不变量的有效状态,就可以了。
(例如漏水实施?)
它没有。由于内容被移出,客户端永远不会知道它是否真的来自班级的内脏。它可能只是您在运算符中创建的新字符串。内部仍然封装良好。
我是否滥用(隐式)转换运算符?如果是这样,我应该使用明确的吗?
隐式转换往往会以各种不良方式与其他功能进行交互。我会尽可能地避开它们。我更喜欢显式成员函数设计。它清楚地说明了被移动的内容,并防止发生事故:)