显式移动构造函数?

Kos*_*Kos 23 c++ explicit-constructor move-constructor c++11

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

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

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

Luc*_*ton 22

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

如果给定类型既没有非显式复制构造函数也没有非显式移动构造函数,则该函数T u = rv;无效且该类型不能与之一起使用std::swap.(在该特定实例中,然而可以专门std::swap提供期望的功能,例如通过使用T u(rv);).

更简单地说,explicit移动或复制构造函数违背了期望,并且不能与通用代码一起使用.

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

  • 删除 unique_ptr<T, D>
  • 调用包装器,用于例如bind(所有传递的衰减类型)
  • thread,async,call_once(所有呼叫包装的条款规定)
  • sort,stable_sort,nth_element,sort_heap


Pup*_*ppy 5

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


Bo *_*son 5

explicit建议将关键字用于(单个参数)转换构造函数,以避免在意外位置发生意外转换.

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