c++内联显式构造函数的优点

what c++ inline explicit constructor is good for?

本文关键字:构造函数 c++      更新时间:2023-10-16

我有时看到这个构造函数写成inline explicit。例如:

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

inline是必要的,如果你在头文件中定义一个函数,而不是在类定义中。它允许在多个翻译单元中定义函数(例如,当包含来自多个源文件的头文件时)。这样做的目的是允许编译器内联调用函数——为了实现这一点,许多编译器要求该定义在翻译单元中可用。

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

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

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

内联显式适合做什么?

在这里,它们都给出了有用的代码气味——作者更看重冗余和过度的结构而不是清晰。单例反模式的使用进一步证明了这一点——在这段代码中要小心。

explicit与构造函数阻止它们被隐式使用。

inline是一种告诉编译器(在过去我们缺乏RAM的时候)该函数是它想要内联的东西的方法。当然,现在他们会忽略我们,或者最多幽默地说"我会考虑一下",潜台词是"愚蠢的人类,以为我不知道吗?"(简而言之,inline现在被忽略了,编译器比我们更有能力决定内联)。