如果在一行中声明两个对象,则按什么顺序构造它们

If two objects are declared in a single line, in which order are they constructed?

本文关键字:什么 顺序 对象 一行 如果 声明 两个      更新时间:2023-10-16

假设一个类被定义为

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

现在我正在创建两个对象作为

A a,b;

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

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

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

它继续说

具有多个声明符的声明通常等效于相应的声明序列,每个声明都有一个 说明符。那是 T D1, D2, ... Dn; 通常相当于 T D1; T D2; ... T Dn; 其中T是一个 decl-specifier-seq,每个Di都是一个 init-declarator。当由以下之一引入的名称时,会发生异常 声明符隐藏 Decl 说明符使用的类型名称,以便在后续文件中使用相同的 Decl 说明符时 声明,它们的含义不同。

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

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

声明

中的每个初始化声明器都单独分析,就好像它一样 本身就是一个宣言。(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 声明器都单独分析,就好像它本身在声明中一样。

例:

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