函数参数的生命周期是否等于未命名的临时值作为' rvalue'引用(它等于称为函数的表达式)?我的' gcc'编译器显示它是。但是我希望看到一个实际的标准文档(可能是最新的' C ++ 11' C ++ 14')。
答案 0 :(得分:7)
虽然标准确实声称参数的生命周期在定义它的函数返回时结束,正如Anton Savin所回答的那样,这不是实现的作用,and the standard will likely be changed to allow what implementations do:
WG决定不指定参数对象是在调用之后立即销毁还是在调用所属的完整表达式结束时销毁。
这意味着函数参数的生命周期将变得未指定。它可能会在函数返回后立即结束,也可能在稍后结束。
答案 1 :(得分:3)
5.2.2 [expr.call]/4
,在C ++ 11和C ++ 14中似乎是相同的:
调用函数时,应初始化每个参数(8.3.5)(8.5,12.8,12.1)及其对应的参数 论点。 [注意:这种初始化相对于彼此不确定地排序(1.9) - 结束注释]如果函数是非静态成员函数,则函数(9.3.2)的this参数应为 用指向调用对象的指针初始化,转换就像通过显式类型转换一样(5.4)。 [注意:此转换无法访问或模糊检查;访问检查和消除歧义 作为(可能是隐式的)类成员访问运算符的一部分完成。见10.2,11.2和5.2.5。 - 结束注释]调用函数时,具有对象类型的参数应完全定义 对象类型。 [注意:这仍然允许参数成为指向不完整类类型的指针或引用。 但是,它会阻止传值参数具有不完整的类类型。 - 注意]期间 一个参数的初始化,一个实现可以避免构建额外的临时 结合相关论证的转换和/或临时建构 初始化参数(见12.2)。 参数的生命周期在其所在的函数结束时 定义返回。每个参数的初始化和销毁都发生在上下文中 调用功能。 [示例:检查构造函数,转换函数或析构函数的访问权限 调用函数中的调用点。如果函数参数的构造函数或析构函数抛出一个 异常,搜索处理程序在调用函数的范围内开始;特别是,如果功能 调用有一个函数-try-block(第15条),带有一个可以处理异常的处理程序,这个处理程序是 不考虑。 -end example]函数调用的值是被调用函数返回的值 如果最终覆盖的返回类型与返回类型不同,则在虚函数调用中除外 静态选择的函数,从最终的覆盖者返回的值被转换为返回类型 静态选择的功能。
这是你要的吗?