函数和结构在c ++中具有相同的名称

Nik*_*iou 8 c++

以下代码在C++中编译

struct foo
{
    int a, b;
};

struct foo foo()
{
    struct foo a;
    return a;
}

int main(void) {
    foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 它应该被允许具有结构和具有相同名称的函数吗?
  2. 因为它编译我然后继续尝试声明类型的对象foo.有办法吗?似乎不可能做到:

    foo a;   // error: expected ‘;’ before ‘a’
    foo a{}; // error: expected ‘;’ before ‘a’
    foo a(); // most vexing parse would kick in any way
    
    Run Code Online (Sandbox Code Playgroud)

Sha*_*our 8

是的,这是允许我们可以看到这个通过草拟C++标准部分3.3.10 名称隐藏2段,它说(强调我的):

类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏.如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见.

在这种情况下struct,在声明中使用将解决您的问题:

struct foo a;
Run Code Online (Sandbox Code Playgroud)