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

问题描述 投票:0回答:2

我不明白这段代码应该在 C 和 C++ 中提供不同的行为(在 C 和 C++ 中有效的代码在用每种语言编译时是否会产生不同的行为?

#include <stdio.h>

struct f { };

int main() {
    f();
}

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

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

c++
2个回答
2
投票

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

f

struct f { };

相当于:

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

所以,是的,在 main 内部,你正在初始化值(或默认初始化,这里是一样的),一个

f
类型的对象。

至于为什么它不调用函数

f
,那么,在
main
内部,没有可用的函数
f
的声明或定义。名为
f
的唯一可见符号是上面定义的结构体。


2
投票

在 C++ 中,表达式

T()
(其中
T
是类型)是创建值初始化的临时值。请注意,这与一般情况下对构造函数的调用不同(特别是对于 POD 类型而言不同)。

© www.soinside.com 2019 - 2024. All rights reserved.