很容易忘记将构造函数标记为“显式”:添加/删除args,使它们成为可选的等等。我知道的唯一可靠方法是将每个构造函数声明为显式,然后仅在需要隐含时才删除此关键字设计(感谢标准,不仅允许单参数构造函数)。但这看起来很难看。
不打算隐式构造函数公开使用(错误的)隐式转换,例如:为here。这可能是偶然发生的,或者可能会破坏向后兼容性
那么为什么“显式”不是构造函数的默认特性,如果这会导致更少的错误呢?
P.S。是的,我读过Stroustrup的“C ++的设计和演变”,只是不记得他是否说过“明确”的内容
答案 0 :(得分:14)
添加显式时的向后兼容性。语言在不断发展,不断变化的语言中现有结构的含义变化是让用户生气的可靠方法。现在仍然如此,向后兼容性是委员会心目中的高度。
答案 1 :(得分:9)
因为当构思C ++时,人们认为没有人会编写愚蠢的代码,并且每个人都会享受到良好的隐式转换会带来的好处,避免在任何地方编写演员表。
当然,事实证明这是错误的,而且到处都有错误的构造函数 。真是太遗憾了。
答案 2 :(得分:3)
有趣的有利位置。我倾向于采取另一方面,并想知道为什么你认为你需要标记所有的构造函数explicit
,直到证明不是这样?
老实说,如果有问题,我不知道你问题的答案。向后兼容似乎可能是最有可能的原因的竞争者,但同样:为什么你希望阻止隐式转换?