当类和函数具有相同的名称时会发生什么

What happens when a class and a function have the same name?

本文关键字:什么 函数      更新时间:2023-10-16
#include <iostream>
using namespace std;
struct test
{
    test(){cout<<"class"<<endl;}
};
void test(){cout<<"function"<<endl;}
int main()
{
    test();
    return 0;
}

输出:

function  

(VS2013 ang gcc 4.8.1(

为什么选择功能?是不是模棱两可?

称为名称隐藏,并在

3.3 作用域

3.3.1 声明性区域和作用域 [basic.scope.declarative]

4( 给定单个声明区域中的一组声明,每个声明 指定相同的非限定名称,
— 它们都应指 同一实体,或全部引用函数和函数模板;或
— 只有一个声明应声明类名或枚举 不是 typedef 名称的名称和其他声明应全部 引用相同的变量或枚举器,或全部引用函数 和功能模板;在本例中为类名或枚举 名称处于隐藏状态 (3.3.10(。[...]

强调我的。

请注意,更改声明顺序不会影响结果:

void test(){cout<<"function"<<endl;}
struct test
{
    test(){cout<<"class"<<endl;}
};
int main()
{
    test();
    return 0;
}

仍然打印出function.

如果它不明显,请不要这样做:)

从 N3485 §3.3.10 [basic.scope.hiding]/2

类名 (9.1( 或枚举名 (7.2( 可以通过变量、数据成员、 函数,或在同一范围内声明的枚举器。

因此,该函数优先于类。

如注释中所述,该类仍可通过 classstruct 关键字访问。如果类优先,则该函数将无法访问。

我不确定前面的任何一个响应都是您的特定实例的"为什么"。

不要误会我的意思;它们是真实和准确的。

我只是觉得更简单。

在您的示例中,您永远不会实例化结构。

换句话说,你声明了它,但你从未使用它。

由于您从未引用过它,因此永远不会调用它。

名称优先级等在这里并不真正适用,因为您从未实例化过结构。

希望这有帮助,

-John