pas*_*sha 63 c++ declaration object-construction language-lawyer
假设一个类被定义为
class A {
//.....
};
现在我正在创建两个对象
A a,b;
按照什么顺序a和b创造的呢?它是由标准定义的吗?
eri*_*rip 78
来自8个声明者[dcl.decl] 3:
声明中的每个init-declarator都会被单独分析,就好像它本身就在声明中一样.
它继续说
具有多个声明符的声明通常等效于具有单个声明符的相应声明序列.即
T D1, D2, ... Dn;通常是等效于T D1; T D2; ... T Dn;其中T是一个DECL说明符-SEQ并且每个Di是一个init说明符.当其中一个声明符引入的名称隐藏了由decl-specifiers使用的类型名称时,会发生异常,因此当在后续声明中使用相同的decl-specifiers时,它们的含义不同.
你可以说它们是从左到右构建的.
Nem*_*emo 52
C++规范第8章[dcl.decl]说:
声明中的每个init-declarator都会被单独分析,就好像它本身就在声明中一样.(100)
脚注(100)继续说:
(100)具有多个声明符的声明通常等效于具有单个声明符的相应声明序列.那是
Run Code Online (Sandbox Code Playgroud)T D1, D2, ... Dn;通常相当于
Run Code Online (Sandbox Code Playgroud)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