C++ 是否为逗号分隔的变量定义分发了所有关键字?

C++ 是否为逗号分隔的变量定义分发了所有关键字?,c++,declaration,C++,Declaration,在这样的声明中 static int a, b, c; static是应用于所有3个变量的定义,还是仅应用于第一个变量?其他关键字如volatile或mutable呢 如果规则对于不同的关键字是不同的,那么它有什么不同 例如,我知道const是分布式的,但指针不是分布式的,例如 int * a, b; 与 int * a; int b; 注意:我试着用const作为例子而不是static来问一个类似的问题,结果被误解了。我想知道根据标准,所有适用关键字的一般规则是什么 让我们这样说吧。

在这样的声明中

static int a, b, c;
static
是应用于所有3个变量的定义,还是仅应用于第一个变量?其他关键字如
volatile
mutable

如果规则对于不同的关键字是不同的,那么它有什么不同

例如,我知道
const
是分布式的,但指针不是分布式的,例如

int * a, b;

int * a;
int   b;
注意:我试着用
const
作为例子而不是
static
来问一个类似的问题,结果被误解了。我想知道根据标准,所有适用关键字的一般规则是什么


让我们这样说吧。在变量类型说明符由多个单词后跟逗号分隔的变量列表组成的任何情况下,如何解析定义/声明?

所有初始类型词都适用于所有变量,或者更准确地说,适用于声明符。声明器是声明中使用的伪表达式

例如:

static int volatile long a, b[10], *&c, *(*const d)(float);
//^^^^^^^^^^^^^^^^^^^^^^
// typey words

//                       ^  ^^^^^  ^^^  ^^^^^^^^^^^^^^^^^^
//                       4 declarators
这里

  • a
    是一个静态易失性长整数
  • b
    是一个可变长整型的静态数组[10]
  • c
    是指向可变长整型的指针的静态引用
  • d
    是一个静态常量指针,指向返回易失长整型指针的函数(采用浮点)
(此外,首字母typey单词的顺序并不重要。)


参考资料:

在C++98(ISO/IEC 14882:1998)(我知道已经过时了,但这部分语言从那时起并没有根本改变)中,我们(都强调我的):

[dcl.dcl]中:

简单声明:
decl说明符seqopt init声明符listopt

[……]

  • init declarator列表中的每个init declarator只包含一个declarator id,该id是该init declarator声明的名称,因此也是该声明声明声明的名称之一decl说明符seq中的类型说明符(7.1.5)和init说明符的递归说明符结构描述了一个类型(8.3),该类型随后与init说明符声明的名称相关联。
  • (该标准更喜欢术语“声明说明符”而不是“类型词”,但它的含义是一样的。)

    这意味着所有类型说明符都与每个声明符相结合,以形成所声明的每个名称的类型。类型说明符包括
    const
    volatile
    signed
    unsigned
    ,以及所有基本类型(
    void
    int
    wchar\u t
    ,…)和用户定义的
    class
    enum
    typedef
    名称(请参见[dcl.Type]/strong>)

    类似的语言适用于存储类说明符,这些说明符在[dcl.stc]中单独列出(
    auto
    register
    static
    extern
    mutable
    ):

  • […]存储类说明符应用于列表中每个init说明符声明的名称,而不应用于其他说明符声明的任何名称。[……]
  • 同样,对于
    typedef
    ,我们有(在[dcl.dcl]中):

  • 如果decl说明符seq包含
    typedef
    说明符,则该声明称为typedef声明,每个init声明符的名称被声明为typedef名称,与其关联的类型同义(7.1.3)。[……]
  • 稍后,关于声明器的章节([dcl.decl])总结了一般原则:

  • 声明的两个组件是说明符(decl说明符seq;7.1)和声明器(init声明器列表)。说明符指示要声明的对象、函数或typedef的类型、存储类或其他属性。声明符指定这些对象、函数或typedef的名称,并(可选)使用诸如
    *
    (指针指向)和
    ()
    (函数返回)之类的运算符修改说明符的类型。[……]

  • 声明中的每个init声明器都被单独分析,就像它自己在声明中一样

  • 当前草案中的等效章节:


    我已经建议您一般避免这种形式。@πάνταῥεῖ 谢谢你的意见,但这不是问题的答案。谢谢你直截了当的回答。有时很难找到一个。我也希望看到标准的引用。@Chipster是的,补充道。DCL.decl.2的神秘含义是指针不分布:例如
    int*a,b声明一个指针和一个int;这就是为什么不应该写
    int*a,b。参考资料也一样。