gpt4 book ai didi

c++ - "Moving out"对象的内部表示。好不好?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:46 24 4
gpt4 key购买 nike

假设我有一个类,它的内部数据表示是一个 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();

LIVE EXAMPLE

具体问题:

  1. 撤出内部代表是 BadIdea™ 吗? (例如漏洞实现?)

  2. 我是否在滥用(隐式)转换运算符?如果是这样,我应该使用明确的吗?示例:

    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();
  3. 如果存在左值的现有转换运算符/函数,我是否应该只定义它?

  4. 我在这里尝试实现的目标是否被视为过早的优化?


有关一些背景信息,请参阅:

最佳答案

Is moving out internal representation a BadIdea™?

我在我的文本类中使用了类似的想法作为逃生舱口,以允许用户出于性能或其他原因对底层字节执行不受限制的操作,而无需不断强制执行我的文本类的不变量。这实质上允许您在第 2 步中做一些中间结果,这些中间结果会违反类的不变量,但实际上不会违反它们。不过,将表示放回原处显然必须再次强制执行不变量。

这些语义对我来说很好,因为我的类明确意味着作为特定表示的不变执行者。

所以我不会说它是 BadIdea™。只要成员处于遵守类不变量的有效状态,就可以了。

(e.g. leaky implementation?)

没必要。由于内容被移出,客户永远不会知道它是否真的来自类的内部。它可能只是您在运算符中创建的新字符串。内部结构仍然封装良好。

Am I abusing the use of (implicit) conversion operator? If so, should I use an explicit one?

隐式转换往往会以各种糟糕的方式与其他功能交互。我会尽可能避开它们。我更喜欢显式成员函数设计。它清楚地表明正在 move 什么,并防止发生事故:)

关于c++ - "Moving out"对象的内部表示。好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21745976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com