如果在一行中声明两个对象,则按什么顺序构造它们
If two objects are declared in a single line, in which order are they constructed?
假设一个类被定义为
class A {
//.....
};
现在我正在创建两个对象作为
A a,b;
a
和b
的创建顺序是什么?它是由标准定义的吗?
来自 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
- 计算 I+V[i++] 的顺序是什么?
- C++:使用方法调用析构函数的顺序是什么?
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 函数模板实例化、替换和重载解析的顺序是什么?
- 变量按什么顺序相乘
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 顺序一致性和获取/发布语义有什么区别?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?
- 堆排序,我无法弄清楚我的代码出了什么问题,输出顺序不正确
- 在 C++ 中,以相反顺序排序的最快方法是什么?
- 操纵器,C 我应该使用什么顺序
- 这种情况以什么顺序发生
- 在 c++ 中应按什么顺序释放内存?
- 具有类层次结构时按什么顺序调用方法
- 我应该按什么顺序发送callback()并通知服务员?
- 如果在一行中声明两个对象,则按什么顺序构造它们
- 交叉引用、前向声明等:按什么顺序
- 我以什么顺序包含头文件?