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

时间:2016-02-22 18:26:24

标签: c++ language-lawyer declaration object-construction

让我们说一个班级被定义为

class A {
//.....
};

现在我正在创建两个对象

A a,b;

ab创建的顺序是什么?它是由标准定义的吗?

5 个答案:

答案 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)

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

请参阅comma operatordeclarators

答案 3 :(得分: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;

答案 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