对于所有 大多数构造函数,建议使用explicit
关键字,可以使用一个参数调用,但复制构造函数除外。
对于复制构造函数,它有一个用途(禁止通过函数调用,返回等隐式复制),但它不是通常想要的。
移动构造函数怎么样?是否有任何合理的用例使它们明确?这里的好习惯是什么?
答案 0 :(得分:20)
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
答案 1 :(得分:5)
对于大多数用途,您可能需要隐式移动构造函数。它们通常与复制构造函数属于同一类别。 所有单参数构造函数不建议使用显式,但建议大多数使用。移动构造函数不在该列表中。
答案 2 :(得分:5)
建议将explicit
关键字用于(单个参数)转换构造函数,以避免意外地点出现意外转换。
=delete
而不是明确。
答案 3 :(得分:2)
实际问题是如何使用显式移动构造函数?它无法在rvalues上调用,因此编译器必须始终选择复制构造函数(如果可用),否则无法编译。
编辑:以下是示例的链接:http://www.ideone.com/nm7KM
答案 4 :(得分:0)
当从函数返回值时,隐式移动构造函数通常可以使该过程更有效。