【问题标题】:"Moving out" internal representation of an object. Okay or not?“移出”对象的内部表示。好不好?
【发布时间】:2014-02-13 05:28:23
【问题描述】:

假设我有一个类,其内部数据表示例如是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. 我在这里尝试实现的目标是否被视为过早优化?


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

【问题讨论】:

  • “我在这里尝试实现的目标是否被视为过早优化?” “优化”是什么意思?您没有指定要优化的潜在缓慢方案。什么是缓慢的替代方案?
  • 在字符串被moved out 之后,你的对象会出现段错误吗?

标签: c++ c++11 move-semantics


【解决方案1】:

移出内部表示是 BadIdea™ 吗?

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

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

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

(例如泄漏的实现?)

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

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

隐式转换往往会以各种不好的方式与其他功能交互。我会尽可能避免它们。我更喜欢显式的成员函数设计。它清楚地表明了正在移动的内容,并防止发生事故:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    相关资源
    最近更新 更多