在函数的参数列表中初始初始化的变量范围

Scope of a variable initialized in the parameter list of a function

本文关键字:初始化 变量 范围 函数 参数 列表      更新时间:2023-10-16

以下代码构建,编译和运行(C ,mingw(似乎没有任何问题。但是,我是否可以保证,即使函数通过参考来获取参数?

如果不是,则在使用函数参数列表中使用其初始化器列表创建对象时(通过参考来参数(可能会很危险,因为它会立即被破坏:在这种情况下,函数不为t有一个副本,但是对内存的引用可能或可能不会被另一个过程重新分配?

struct S
{
  S() : a(0), b(0) {}
  S(int a, int b) : a(a), b(b) {}
  int a;
  int b;
};
void foo(const S& s)
{
  std::cout << "s.a = " << s.a << std::endl;
  std::cout << "s.b = " << s.b << std::endl;
}
int main()
{
  foo({4,5}); // <-- What is the scope of the struct initialized here?
  return 0;
}

根据cppreference [lifetime]:

所有临时对象均被销毁,作为评估的最后一步 全表达(词法(包含了它们的点 创建,如果创建了多个临时对象,它们是 以与创造顺序相反的顺序被摧毁。这是真实的 即使该评估以抛出异常结束。

这意味着临时对象将在返回后销毁,因此它是完全安全的。

在此处实现的prvalue是从支撑的列表{4,5}中创建类型S的临时对象,该对象在全表达结束时被破坏。在您的情况下foo({4,5});