C语言与C++中关于内联函数的陷阱

C语言的内联函数默认为内部链接,所以不阻止其他文件定义同名外部函数。但如果在其他文件中定义了同名外部函数,则在定义内联函数的文件中调用此函数属于未指定行为,该调用可能会调用外部函数。

注意由于在一个文件中调用函数前需要声明,并且该声明不能和定义冲突,所以即便外部函数与内联函数的原型不同,也做不到在定义内联函数的文件中声明此外部函数,因为对外部函数的声明会和内联函数的定义冲突。此时如果在定义内联函数的文件中又实际调用了外部函数,则调用形式不满足外部函数的实际定义,行为更加危险。

Read More »

C++中explicit的复制构造函数是什么意思

在C++中,对于一个类中只接受一个实参的构造函数,相当于定义了从实参类型到此类型的隐式转换机制。而将这个构造函数声明为explicit的话,则会禁止这样的隐式转换,这个构造函数将无法被隐式调用,而是只能用来直接初始化。

这样就引出一个问题:如果复制构造函数(接受一个const 本类型& 的实参)被声明为explicit,代表什么意思?是说不允许隐式调用复制构造函数了吗?而用等号来对这类对象进行复制初始化时,等号右边的对象总是要先转换为本类型,之后再隐式调用复制构造函数,如果是这样的话,那是不是意味着我们将无法再进行复制初始化,而是只能用直接初始化的方式直接调用此复制构造函数了呢?

Read More »