如果两个对象在一行中声明,那么它们按什么顺序构造?
假设一个类被定义为
class A { //..... };
现在我正在创build两个对象
A a,b;
a
和b
以什么顺序创build? 它是由标准定义的吗?
来自8个申报人[dcl.decl] 3:
声明中的每个初始声明都是分别进行分析的,就像它本身在声明中一样。
它继续说
具有多个声明符的声明通常相当于每个具有一个声明符的相应声明序列。 那就是
T D1, D2, ... Dn;
通常相当于T D1; T D2; ... T Dn;
T D1; T D2; ... T Dn;
其中T
是一个decl-specifier-seq,每个Di
是一个init-declarator。 当由其中一个声明者引入的名称隐藏由decl-specifier使用的types名称时会发生exception,因此,当在后续声明中使用相同的decl-说明符时,它们的含义不同。
你可以说他们是从左到右build造的。
C ++规范第8章[dcl.decl]说:
声明中的每个初始声明都是分别进行分析的,就像它自己在声明中一样。 (100)
脚注(100)继续说:
(100)具有多个声明符的声明通常等价于每个具有单个声明符的相应声明序列。 那是
T D1, D2, ... Dn;
通常相当于
T D1; T D2; ... T Dn;
然后列举出一些例外,这些例外都不适用。
所以你的问题的答案是,对象是按照你列出的顺序构造的。 不,它不是一个逗号运算符。
订单是从左到右的书面订单。 另外,它不是逗号运算符,而只是一个声明的列表。 当使用用户定义的逗号操作符时,实际上订单是未指定的。
请参阅逗号运算符和声明 符 。
a将被创build,然后b 。
这种情况下的逗号将被用作分隔符而不是运算符。
例如从维基百科:
/** * Commas act as separators in this line, not as an operator. * Results: a=1, b=2, c=3, i=0 */ int a=1, b=2, c=3, i=0;
标准:
声明者[dcl.decl]:
声明中的每个初始声明都是分别进行分析的,就像它自己在声明中一样。
例:
class A { public: A(std::string const &s): name(s) { std::cout << "I am " << name << '\n'; } std::string name; }; auto main() -> int { A a("a"), b("b"); }
输出:
I am a I am b