【问题标题】:what c++ inline explicit constructor is good for? [duplicate]c++ 内联显式构造函数有什么用? [复制]
【发布时间】:2014-05-01 21:31:15
【问题描述】:

我有时会看到这个构造函数使用内联显式编写。 例如:

protected : 
    inline explicit Singleton() { 

        CCASSERT(Singleton::instance_ == 0, "error Singleton::instance_ == 0."); 
        Singleton::instance_ = static_cast<T*>(this); 
    }
    inline ~Singleton() { 
        Singleton::instance_ = 0; 
    }

内联显式有什么好处?

【问题讨论】:

  • inlineexplicit 是两个不同的关键字。所以我猜你在问explicit 是什么意思,here 已经回答了。
  • 你问的是inlineexplicit之间的组合吗?因为这不会为这两个修饰符的各自行为添加任何内容。
  • @Zeta 但是没有任何构造函数参数的explicit 有什么意义??
  • 在无参数构造函数上显式在 C++11 中绕过大括号初始化是有意义的。
  • 顺便说一句,据我所知,如果你把函数体放在类的 { } 中,函数默认是内联的

标签: c++ inline


【解决方案1】:

explicit 带有构造函数会阻止它们被隐式使用。

inline 是一种告诉编译器(在过去我们缺少RAM)该函数是它想要内联的东西的一种方式。当然,现在他们无视我们,或者最多用“我会考虑一下”的潜台词“愚蠢的人类,以为我已经不知道了?”来逗我们一笑。 (简而言之,inline 现在被忽略了,编译器比我们决定内联的位置要好得多)。

【讨论】:

    【解决方案2】:

    inline 是必需的,如果您在标头中定义函数,而不是在类定义中。它允许在多个翻译单元中定义函数(即,当包括来自多个源文件的标题时)。目的是允许编译器内联对函数的调用 - 许多编译器要求定义在翻译单元中可用才能做到这一点。

    在这种情况下,这是没有意义的:在类定义中定义的函数是隐式内联的。

    explicit 表示构造函数不能用于隐式类型转换。从历史上看,它只对单参数构造函数有意义;但我认为这些天它也可以用来防止大括号初始化。

    在这种情况下,它也毫无意义:默认构造函数不用于隐式转换。

    内联显式有什么好处?

    在这里,它们都给出了有用的代码味道——作者重视冗长和过度的结构而不是清晰。使用 Singleton 反模式进一步证明了这一点 - 在此代码中小心行事。

    【讨论】:

    • +1:但我要声明的是,在类定义中,inline 对于其中定义的所有函数都是隐含的。
    • @phresnel:确实,这就是我在第二段中陈述的原因。
    • @AlecTeal:这不是重言式 - 它的目的是允许多个定义(因此允许在多个翻译单元中内联)。没有它,正如你所说,你不允许有多个定义。
    • 关于大括号初始化,显式构造函数应该进行复制初始化,T t = {};,非法,但T t{}; 应该没问题。虽然 GCC 4.8.2 似乎允许前者。我认为这是一个错误。
    猜你喜欢
    • 2013-10-16
    • 2023-03-22
    • 2012-07-13
    • 2017-10-30
    • 1970-01-01
    • 2016-10-13
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多