62

假设一个类被定义为

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

现在我正在创建两个对象

A a,b;

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

4

5 回答 5

78

来自 8 个声明符 [dcl.decl] 3:

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

它继续说

具有多个声明符的声明通常等效于相应的声明序列,每个声明都具有单个声明符。这 T D1, D2, ... Dn; 通常等同于 T D1; T D2; ... T Dn; where Tis a decl-specifier-seq 并且 eachDi是 init-declarator。当其中一个声明符引入的名称隐藏了 decl-specifiers 使用的类型名称时会发生异常,因此当在后续声明中使用相同的 decl-specifiers 时,它们没有相同的含义。

你可以说它们是从左到右构造的。

于 2016-02-22T18:35:52.150 回答
52

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

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

脚注(100)接着说:

(100) 具有多个声明符的声明通常等效于相应的声明序列,每个声明都具有一个声明符。那是

T D1, D2, ... Dn;

通常相当于

 T D1; T D2; ... T Dn;

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

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

于 2016-02-22T18:36:37.087 回答
11

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

请参阅逗号运算符声明符。

于 2016-02-22T18:31:07.773 回答
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;
于 2016-02-22T18:30:59.910 回答
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
于 2016-02-22T22:03:02.627 回答