“移出”对象的内部表示。好还是不好?

时间:2014-02-13 05:28:24

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

假设我有一个类,其内部数据表示例如是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. 如果l值存在转换运算符/函数,我是否应该只定义它?

  4. 我在这里想要实现的是不成熟的优化吗?


  5. 有关背景信息,请参阅:

1 个答案:

答案 0 :(得分:3)

  

将内部代表移出BadIdea™?

我在我的文本类中使用了一个类似的想法作为转义填充,允许用户对性能或其他任何原因执行基础字节的自由操作,而不会不断地强制执行文本类的不变量。这基本上允许您在第2步执行具有中间结果的事情,这些结果会违反类的不变量而不会实际违反它们。然而,将表示重新放入必须再次强制执行不变量。

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

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

  

(例如漏水实施?)

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

  

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

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