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

mag*_*nus 28 c++ scope initializer-list

以下代码构建,编译和运行(C++,mingw)似乎没有任何问题.但是,我保证在函数的参数列表中使用初始化列表构造的对象仍然存在于该函数的范围内,即使该函数通过引用获取参数?

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

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;
}
Run Code Online (Sandbox Code Playgroud)

amc*_*176 35

根据cppreference [life]:

所有临时对象都作为评估全表达式的最后一步销毁,该表达式(词法上)包含创建它们的点,并且如果创建了多个临时对象,则它们将按照与创建顺序相反的顺序销毁.即使该评估以抛出异常结束,也是如此.

这意味着临时对象将在函数返回后被销毁,因此它非常安全.


Yol*_*ola 7

这里prvalue实现了S从braced-init-list 创建类型的临时对象,该列表{4,5}在完整表达式的末尾被销毁.在你的情况下foo({4,5});.