让我们说一个班级被定义为
class A {
//.....
};
现在我正在创建两个对象
A a,b;
a
和b
创建的顺序是什么?它是由标准定义的吗?
答案 0 :(得分:78)
来自8个声明者[dcl.decl] 3:
声明中的每个init-declarator都会被单独分析,就好像它本身就在声明中一样。
接着说
具有多个声明符的声明通常等效于相应的声明序列,每个声明都有一个声明 声明符。那是
T D1, D2, ... Dn;
通常相当于T D1; T D2; ... T Dn;
其中T
是decl-specifier-seq,每个Di
是init-declarator。当一个名称引入时,会发生异常 声明符隐藏了decl-specifiers使用的类型名称,以便在后续使用相同的decl-specifiers时 声明,它们没有相同的含义。
你可以说它们是从左到右构建的。
答案 1 :(得分:52)
C ++规范第8章[dcl.decl],说:
声明中的每个 init-declarator 将被单独分析,就像它一样 是一个声明本身。 (100)
脚注(100)继续说:
(100)具有多个声明符的声明通常等同于 相应的声明序列,每个声明都有一个声明符。 那是
T D1, D2, ... Dn;
通常相当于
T D1; T D2; ... T Dn;
...然后列出一些例外情况,在这种简单的情况下都不适用。
因此,您的问题的答案是对象按您列出的顺序构建。不,它不是逗号运算符。
答案 2 :(得分:11)
订单是从左到右的书面订单。此外,它不是逗号运算符,而只是一个声明符列表。当使用用户定义的逗号运算符时,订单实际上是未指定的。
答案 3 :(得分:8)
在这种情况下,逗号将用作分隔符,而不是用作运算符。
例如来自维基百科:
/**
* 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;
答案 4 :(得分:6)
标准:
声明者[dcl.decl]:
声明中的每个init-declarator都会被单独分析,就好像它本身就在声明中一样。
示例:
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