假设一个类被定义为
class A {
//.....
};
现在我正在创建两个对象
A a,b;
以什么顺序创建a
和b
创建?它是由标准定义的吗?
假设一个类被定义为
class A {
//.....
};
现在我正在创建两个对象
A a,b;
以什么顺序创建a
和b
创建?它是由标准定义的吗?
来自 8 个声明符 [dcl.decl] 3:
声明中的每个 init-declarator 都被单独分析,就好像它本身在声明中一样。
它继续说
具有多个声明符的声明通常等效于相应的声明序列,每个声明都具有单个声明符。这
T D1, D2, ... Dn;
通常等同于T D1; T D2; ... T Dn;
whereT
is a decl-specifier-seq 并且 eachDi
是 init-declarator。当其中一个声明符引入的名称隐藏了 decl-specifiers 使用的类型名称时会发生异常,因此当在后续声明中使用相同的 decl-specifiers 时,它们没有相同的含义。
你可以说它们是从左到右构造的。
C++ 规范第 8 章 [dcl.decl] 说:
声明中的每个init-declarator都被单独分析,就好像它本身在声明中一样。(100)
脚注(100)接着说:
(100) 具有多个声明符的声明通常等效于相应的声明序列,每个声明都具有一个声明符。那是
T D1, D2, ... Dn;
通常相当于
T D1; T D2; ... T Dn;
...然后列出一些例外情况,这些例外情况都不适用于这种简单的情况。
因此,您的问题的答案是对象是按照您列出它们的顺序构造的。不,它不是逗号运算符。
a将首先创建,然后是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]:
声明中的每个 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