内括号声明对象的范围

时间:2013-03-22 22:33:07

标签: c++ scope

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

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

即。我通过直接调用后者的构造函数创建了一个objectA和另一个对象“anotherclass”,什么是“anotherclass”的范围?

只有当main()完成时才会被破坏吗?

2 个答案:

答案 0 :(得分:4)

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

根据C ++ 11标准的第12.2 / 3段:

  

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

出于这个原因,如果myclass的构造函数通过 reference (左值引用anotherClass或右值引用)获取类型const的参数,它不会存储它以供将来使用,因为如果传递临时它将悬空,并且取消引用它将是未定义的行为。

只有objectA超出范围并在从main()函数返回时被销毁。

答案 1 :(得分:2)

anotherclass对象没有范围。范围是名称的属性,而不是对象的属性,并且此对象未命名。它只是一个临时对象,在完整表达结束时将被销毁。

这是范围的定义(§3.3.1):

  

通常,每个特定名称仅在某些可能不连续的情况下有效   程序文本的一部分称为范围