【发布时间】:2017-12-25 01:35:06
【问题描述】:
一般来说,我听说在带有单个参数的构造函数上使用显式关键字是一种很好的做法。但是,从 C++11 开始,具有多个参数的构造函数可用于隐式转换。因此,将显式关键字应用于> 0个参数的所有构造函数是一种好习惯吗?
【问题讨论】:
一般来说,我听说在带有单个参数的构造函数上使用显式关键字是一种很好的做法。但是,从 C++11 开始,具有多个参数的构造函数可用于隐式转换。因此,将显式关键字应用于> 0个参数的所有构造函数是一种好习惯吗?
【问题讨论】:
explicit 的一般规则是,你希望这个构造函数被隐式调用吗?
如果是,请不要明确表达。
如果不是,请明确说明。
对于 1 个参数 ctor,如果从该类型转换与在需要时将 int 转换为 double 一样无损且无害,则将其设为隐式。
对于 >1 个参数 ctor,确定您是否希望基于 {} 的构造工作。有时这是个好主意,有时是个坏主意。
在 C++11 和 14 中,需要 {} 构造,以便在无法移动或复制类型时从函数返回值。在某些情况下,如果您出于任何原因想要避免“隐式使用 {}”,您将使用标记类型使 {} 更加明确。
在 C++17 中,真正需要{} 的理由较少,因为纯右值不再是对象,而是构造指令;这意味着return T(blah) 不会在返回T 的函数中移动/复制T,而是从blah 构造它。
您何时想要阻止 {} 是一个见仁见智的问题,不适合 SO Q&A。
【讨论】: