#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)
为什么选择功能?这不是歧义吗?
答案 0 :(得分:18)
这称为名称隐藏,并在
中进行了描述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中所述,仍可通过class
或struct
关键字访问该课程。如果该类优先,则该函数将无法访问。
答案 2 :(得分:-3)
我不确定以前的任何一个回复都是您特定实例的“原因”。
别误会我的意思;它们是真实准确的。
我认为这更简单。
在您的示例中,您永远不会实例化该结构。
换句话说,你宣布它,但你从未使用它。
由于您从未引用它,因此永远不会调用它。
名称优先级在此处并不真正适用,因为您从未实例化过结构。
希望这有帮助,
-John