如果在一行中声明了两个对象,它们的构造顺序是什么?

pas*_*sha 63 c++ declaration object-construction language-lawyer

假设一个类被定义为

class A {
//.....
};
Run Code Online (Sandbox Code Playgroud)

现在我正在创建两个对象

A a,b;
Run Code Online (Sandbox Code Playgroud)

按照什么顺序ab创造的呢?它是由标准定义的吗?

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时,它们的含义不同.

你可以说它们是从左到右构建的.

  • 打败我45秒:-) (8认同)
  • 好吧,它说'通常'. (8认同)
  • @erip它会为`D2`调用copy*构造函数*.不是复制赋值运算符. (7认同)
  • @HagenvonEitzen:主要的例子是变量与类型同名.`SS,T;`有效; `SS; ST;`是一个错误.较新的例子是`auto x = 1; auto y = 2.0;`工作; `auto x = 1,y = 2.0;`是一个错误.这些是脚注提供的唯一例子.所以"通常",如果有的话,有点轻描淡写. (4认同)
  • @pasha`T D1,D2 = D1;`变为`T D1; T D2 = D1;`遵守规则是的. (2认同)

Nem*_*emo 52

C++规范第8章[dcl.decl]说:

声明中的每个init-declarator都会被单独分析,就好像它本身就在声明中一样.(100)

脚注(100)继续说:

(100)具有多个声明符的声明通常等效于具有单个声明符的相应声明序列.那是

T D1, D2, ... Dn;
Run Code Online (Sandbox Code Playgroud)

通常相当于

 T D1; T D2; ... T Dn;
Run Code Online (Sandbox Code Playgroud)

...然后列出一些例外情况,在这种简单的情况下都不适用.

因此,您的问题的答案是对象按您列出的顺序构建.不,它不是逗号运算符.

  • @SergeyA通过阅读"通常"变为"否"的例外情况,然后采用肯定的补语.:) (9认同)
  • 在这种情况下,您如何理解"通常"? (7认同)
  • @erip,相当一个过程:) (5认同)
  • @SergeyA我相信你知道,这就是编写C++时游戏的名称.; d (5认同)

Yam*_*vic 11

订单是从左到右的书面订单.此外,它不是逗号运算符,而只是一个声明符列表.使用用户定义的逗号运算符时,实际上未指定顺序.

请参见逗号运算符声明.


Pri*_*jee 8

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;
Run Code Online (Sandbox Code Playgroud)


And*_* DM 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");
}
Run Code Online (Sandbox Code Playgroud)

输出:

I am a
I am b
Run Code Online (Sandbox Code Playgroud)

  • 这段代码并不能证明这是真的.标准报价是. (3认同)