临时结构对象构造函数奇数调用

时间:2012-10-16 22:38:06

标签: c++ compiler-construction

我不明白这段代码应该在C和C ++中提供不同的行为(Can code that is valid in both C and C++ produce different behavior when compiled in each language?

#include <stdio.h>

struct f { };

int main() {
    f();
}

int f() {
    return printf("hello");
}

为什么我可以在C ++中调用f()?它是默认的构造函数(顺便说一句,我没有看到,是否有另一个“隐式”?)?在没有调用f()函数的C ++中..

2 个答案:

答案 0 :(得分:2)

除非您定义其他构造函数,否则每个类都有一个隐式默认构造函数。类f的定义:

struct f { };

相当于:

struct f { 
    f() = default;
    // same for copy constructors, move constructors, destructor, etc
};

所以是的,在main中,你是值初始化(或默认初始化,这里是相同的),类型为f的对象。

为什么它没有调用函数f,好吧,在main内部,没有可用的函数f的声明和定义。唯一可见的名为f的符号是上面定义的结构。

答案 1 :(得分:2)

在C ++中,表达式T() T是一种类型,是创建一个值初始化的临时表。请注意,这与通常对构造函数的调用不同(特别是对于POD类型,它是不同的。)