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

时间:2014-10-13 14:06:26

标签: c++ ambiguity ambiguous-call

#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 个答案:

答案 0 :(得分:18)

这称为名称隐藏,并在

中进行了描述

3.3范围[basic.scope]

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

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

答案 1 :(得分:9)

来自N3485§3.3.10[basic.scope.hiding] / 2:

  

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

因此,该函数优先于该类。

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

答案 2 :(得分:-3)

我不确定以前的任何一个回复都是您特定实例的“原因”。

别误会我的意思;它们是真实准确的。

我认为这更简单。

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

换句话说,你宣布它,但你从未使用它。

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

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

希望这有帮助,

-John