一般来说,我听说在只有一个参数的构造函数中使用explicit关键字是一种好的做法。然而,自C++11以来,具有多个参数的构造函数可以用于隐式转换。因此,将explicit关键字应用于所有大于0个参数的构造函数是否是一种好的做法?
对于显式构造函数的一般规则是,你想要这个构造函数被隐式调用吗?
如果是,就不要将其设置为显式。
如果不是,就将其设置为显式。
对于只有一个参数的构造函数,如果从该类型进行转换与将一个int
转换为double
一样没有损失和无害,那么将其设置为隐式。
对于有多个参数的构造函数,确定是否希望基于{}
的构造工作。有时候这是一个好主意,有时候则不是。
在C++11和14中,当类型无法移动或复制时,需要使用{}
构造函数才能从函数返回值。在某些情况下,您将使用标记类型使{}
比通常更明确,以避免由于某种原因而出现“隐式{}
使用”。
在C++17中,真正需要{}
的原因较少,因为prvalues不再是对象,而是构造指令;这意味着return T(blah)
在返回T
的函数中不会移动/复制T
,而是直接从blah
构造它。
关于何时阻止{}
的问题,这是一个主观的问题,不适合在SO Q&A上讨论。