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

时间:2018-02-14 11:46:14

标签: 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;
}

2 个答案:

答案 0 :(得分:34)

根据cppreference [lifetime]

  

作为评估的最后一步,所有临时对象都被销毁   完整表达(词汇上)包含它们所在的点   创建,如果创建了多个临时对象,它们就是   按照与创造顺序相反的顺序销毁。这是真的   即使该评估以抛出异常而告终。

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

答案 1 :(得分:7)

这里prvalue具体化,用于从braced-init-list S创建类型为{4,5}的临时对象,该对象在full-expression结束时被销毁。在您的情况下foo({4,5});