【问题标题】:Is there any downside to marking all C++ constructors explicit?显式标记所有 C++ 构造函数有什么缺点吗?
【发布时间】:2011-08-07 21:19:53
【问题描述】:

有几次,在重构代码的时候,在给之前的无参数构造函数添加参数,或者从之前的多参数构造函数中移除参数时,忘记添加explicit 关键字。为了防止这种情况,我养成了标记每个构造函数explicit 的习惯,不管它有多少参数。 (当然,我实际上想要隐式转换的那些构造函数除外。)

这有什么缺点吗?表现?编译时间?

【问题讨论】:

标签: c++ performance explicit-constructor


【解决方案1】:

不会有运行时性能差异。编译时间差异可能无法检测到。

我认为声明所有带有参数explicit 的构造函数并没有什么坏处,只是对于带有多个参数的构造函数可能看起来多余。

如果您使用explicit 默认构造函数声明类型,则可能无法将其与集合类型一起使用。

【讨论】:

    【解决方案2】:

    我不确定,但我认为复制构造函数为explicit 确实会产生一些意想不到的后果。除此之外,我认为你还可以。

    【讨论】:

    • 复制构造函数的优点,我想知道按值传递/返回的效果。
    • 曾经给我解释过;我的结论是不要明确复制构造函数,也不用担心细节。 IIRC,是的,这意味着该类型的对象不能按值传递给函数。但我不再确定了。
    • 这听起来很熟悉,而且确实:bytes.com/topic/c/answers/131511-explicit-copy-constructor。 CWG 152,在 C++03 中修复。
    【解决方案3】:

    它没有任何缺点。它将是未来安全的,因为在 C++0x 中,多参数构造函数使用多元素初始化器列表参与初始化,并且可以禁止在使用 explicit 仅应用隐式转换的情况下使用。

    所以如果你发现一个给定的多参数构造函数在逻辑上不能代表你的类的值,我认为最好把它设为explicit(例如:我会将容器构造函数(size_t size, T defaultValue)设置为explicit , 而pair, (T first, U second) 的构造函数被设置为非显式)。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 2023-03-19
      • 2019-12-27
      • 2016-12-19
      • 2014-05-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多