Ámbito de una variable inicializada en la lista de parámetros de una función


El siguiente código construye, compila y ejecuta (C++, mingw) aparentemente sin ningún problema. Sin embargo, ¿estoy garantizado que los objetos construidos con listas inicializadoras dentro de la lista de parámetros de una función, viven a través del alcance de esa función, aunque la función tome el argumento por referencia?

Si no es así, es cierto que al crear un objeto usando su inicializador-lista en la lista de parámetros de una función (que toma el argumento por referencia) puede ser peligroso porque se destruirá inmediatamente: En este caso, la función no tiene una copia, sino una referencia a la memoria que puede, o no puede ser reasignada por otro proceso?

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;
}
Author: magnus, 2018-02-14

2 answers

De acuerdo con cppreference [lifetime]:

Todos los objetos temporales son destruidos como el último paso en la evaluación de la expresión completa que (léxicamente) contiene el punto donde estaban creado, y si se crearon varios objetos temporales, son destruido en el orden opuesto al orden de la creación. Esto es verdad incluso si esa evaluación termina en lanzar una excepción.

Eso significa que el objeto temporal será destruido después de la función ha regresado, por lo que es perfectamente seguro.

 32
Author: amc176,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 11:54:22

Aquí prvalue se materializó para crear un objeto temporal de tipo S a partir de la lista de inicio entre corchetes {4,5}, que se destruye al final de la expresión completa. En su caso foo({4,5});.

 7
Author: Yola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 12:13:34