圆括号内声明对象的作用域

Scope of an inside-parenthesis declared object

本文关键字:作用域 对象 声明 圆括号      更新时间:2023-10-16

如果我这样声明一个对象:

void main()
{
    myclass objectA(anotherclass(true,true,0));
}

。我创建一个对象和另一个对象"另一个类"通过直接调用后者的构造函数,什么是"另一个类"的作用域?

只在main()结束时才被销毁吗?

临时对象在包含它的完整表达式的末尾被销毁,即当调用myclass的构造函数返回时。

c++ 11标准第12.2/3段:

临时对象在最后一步被销毁在(词法上)包含创建点的完整表达式(1.9)中求值。这是真的即使该求值以抛出异常结束。销毁的值计算和副作用临时对象只与完整表达式相关联,而不与任何特定的子表达式相关联。

因此,如果myclass的构造函数通过引用(对const的左值引用或右值引用)接受anotherClass类型的参数,它不应该存储它以供将来使用,因为如果传递临时变量,它将悬空,并且对其解引用将是未定义的行为。

当从main()函数返回时,只有objectA超出作用域并被销毁。

anotherclass对象没有作用域。作用域是名称的属性,而不是对象的属性,并且这个对象没有命名。它只是一个临时对象,将在完整表达式结束时被销毁。

作用域的定义(§3.3.1):

一般来说,每个特定的名称只在一些可能不连续的范围内有效程序文本中称为作用域的部分