c++ initialization list
¿Por qué tomar una std:: initializer_list por rvalue reference vs. por valor? (2)
No estoy seguro de tener una buena razón, pero supongo que el autor del código podría haber pensado que pasar una lista de inicializadores por valor haría copias innecesarias de los elementos de la lista. Esto, por supuesto, no es cierto: copiar una lista de inicializadores no copia los valores subyacentes.
La mayoría del código de C ++ 11 que toma std::initializer_list
que he visto lo toma por valor, pero a veces se toma como referencia rvalue. ¿Hay alguna buena razón para hacer esto?
Por ejemplo, casi todos los ejemplos que he encontrado hacen esto:
class A {
public:
A(std::initializer_list<int>);
};
Pero sigo viendo esto hecho de vez en cuando:
class B {
public:
B(std::initializer_list<int> &&);
};
Entiendo el uso y el propósito de las referencias de valores en general , pero ¿por qué una de estas sería preferida sobre la otra en el caso de una std::initializer_list
? Lo único en lo que podría pensar es que la class A
permite que la lista de inicializadores se construya por separado, y la class B
impide.
std::initializer_list<int> values {1,2,3,4};
A a(values); // valid
B b(values); // error
Pero no puedo pensar en una buena razón por la que prevenir eso sería algo deseable.
Entonces, ¿por qué se tomaría una referencia std::initializer_list
por rvalue en lugar de por valor?
std::initializer_list
incorpora la semántica de referencia incluso cuando se pasa por valor, por lo que pasar por referencia es, en el mejor de los casos, engañoso. (Solo contiene punteros que no son propietarios).
Hay referencias universales que se unen a cualquier cosa, pero no se pueden inicializar con la sintaxis de lista de iniciaciones (es decir, { x, y }
), por lo que obtener una referencia de lista de initializer_list
tomaría una combinación de circunstancias.