C++中的多个声明

Hec*_*tor 4 c++ language-lawyer c++11

在[basic.scope.declarative] p4中,有人读

给定一个声明区域中的一组声明,每个声明都指定相同的非限定名称, - (4.1)它们都应引用同一个实体......

天真的阅读可能意味着以下代码可能有效,因为"两个声明都引用同一个实体":

int x;
int x;
Run Code Online (Sandbox Code Playgroud)

然后可能会记住一个定义规则[basic.def.odr] p1.上述推理可能仅适用于不是定义的声明.区别在[basic.def] p2中详细说明.例如,以下代码肯定是有效的:

extern int x;
extern int x;
Run Code Online (Sandbox Code Playgroud)

[basic.def] p2中的最后一个示例表明以下代码应该有效,但它不能编译(使用MSVC2015).

struct B
{
    int y;
};

struct D : B
{
    using B::y;
    using B::y;
};
Run Code Online (Sandbox Code Playgroud)

问题出在哪儿?


错误消息是

'B :: y'的using声明不能与'B :: y'的现有using声明共存

Ant*_*ony 5

[namespace.udecl] p10中的这个示例与您的完全相同:

struct B {
   int i;
};
struct X : B {
   using B::i;
   using B::i; // error: double member declaration
};
Run Code Online (Sandbox Code Playgroud)

该错误由[class.mem] p1备份:

成员不应在成员规范中声明两次,除非可以声明嵌套类或成员类模板,然后再定义,除了可以使用opaque-enum-declaration引入枚举,稍后使用enum-specifier.

所以你走在正确的轨道上.多个声明都可以,只要它们不破坏其他规则(例如一个定义,成员规范等)

例如,以下内容很好:

struct X;
struct X;
Run Code Online (Sandbox Code Playgroud)

或者更复杂的例子:

struct X 
{
    struct A;
    struct A
    {
       int y;
    };
}; 

struct X;
struct X::A;
Run Code Online (Sandbox Code Playgroud)