如果我声明一个这样的对象:
void main()
{
myclass objectA(anotherclass(true,true,0));
}
即。我通过直接调用后者的构造函数创建了一个objectA和另一个对象“anotherclass”,什么是“anotherclass”的范围?
只有当main()完成时才会被破坏吗?
答案 0 :(得分:4)
临时在包含它的完整表达式的末尾被破坏,即当对myclass
的构造函数的调用返回时。
根据C ++ 11标准的第12.2 / 3段:
临时对象作为最后一步被销毁 在评估全表达式(1.9)时(词法上)包含创建它们的点。这是真的 即使该评估以抛出异常结束。破坏的价值计算和副作用 临时对象仅与完整表达式相关联,而不与任何特定子表达式相关联。
出于这个原因,如果myclass
的构造函数通过 reference (左值引用anotherClass
或右值引用)获取类型const
的参数,它不会存储它以供将来使用,因为如果传递临时它将悬空,并且取消引用它将是未定义的行为。
只有objectA
超出范围并在从main()
函数返回时被销毁。
答案 1 :(得分:2)
anotherclass
对象没有范围。范围是名称的属性,而不是对象的属性,并且此对象未命名。它只是一个临时对象,在完整表达结束时将被销毁。
这是范围的定义(§3.3.1):
通常,每个特定名称仅在某些可能不连续的情况下有效 程序文本的一部分称为范围。