显式移动构造函数?

时间:2011-07-20 07:55:07

标签: c++ c++11 explicit-constructor move-constructor

对于所有 大多数构造函数,建议使用explicit关键字,可以使用一个参数调用,但复制构造函数除外。

对于复制构造函数,它有一个用途(禁止通过函数调用,返回等隐式复制),但它不是通常想要的。

移动构造函数怎么样?是否有任何合理的用例使它们明确?这里的好习惯是什么?

5 个答案:

答案 0 :(得分:20)

explicit移动构造函数可能会影响与...的兼容性标准算法。例如,std::swap<T>要求T为MoveConstructible。反过来,MoveConstructible是根据表达式指定的,即T u = rv;(其中rvT类型的右值。)

如果给定类型既没有非显式复制构造函数也没有非显式移动构造函数,则T u = rv;无效,并且该类型不能与std::swap一起使用。 (在此特定情况下,可以专门设置std::swap以提供所需的功能,例如使用T u(rv);)。

更简单地说,explicit移动或复制构造函数无视期望,也不能与通用代码一起使用。

标准库的其他部分放置了MoveConstructible要求:

  • unique_ptr<T, D>
  • 的删除者
  • 调用包装器,用于例如bind(所有传递的腐朽类型都是关注的)
  • threadasynccall_once(所有根据调用包装器指定)
  • sortstable_sortnth_elementsort_heap

答案 1 :(得分:5)

对于大多数用途,您可能需要隐式移动构造函数。它们通常与复制构造函数属于同一类别。 所有单参数构造函数不建议使用显式,但建议大多数使用。移动构造函数不在该列表中。

答案 2 :(得分:5)

建议将explicit关键字用于(单个参数)转换构造函数,以避免意外地点出现意外转换。

在这个意义上,复制构造函数和移动构造函数几乎不会“令人惊讶”。它们大部分发生在预期的地如果你不想要它们,我希望它们被标记为=delete而不是明确。

答案 3 :(得分:2)

实际问题是如何使用显式移动构造函数?它无法在rvalues上调用,因此编译器必须始终选择复制构造函数(如果可用),否则无法编译。

编辑:以下是示例的链接:http://www.ideone.com/nm7KM

答案 4 :(得分:0)

当从函数返回值时,隐式移动构造函数通常可以使该过程更有效。