libreria contenedores c++ c++14 perfect-forwarding

contenedores - libreria list c++



¿Por qué usar std:: forward en el contenedor antes de acceder al elemento? (1)

Scott Meyers en su nuevo libro "Effective Modern C ++" muestra la siguiente función como ejemplo de uso de decltype(auto) (página 28):

template<typename Container, typename Index> decltype(auto) authAndAccess(Container&& c, Index i) { authenticateUser(); return std::forward<Container>(c)[i]; }

Mi pregunta es simple. ¿Por qué necesitamos std::forward aplicado a c aquí? No estamos pasando c ninguna parte, estamos llamando operator[] en él. Y ninguno de los contenedores estándar tiene sobrecargas de calificación ref (sobrecargas de valor r / valor l) del operator[] .

Así que solo veo dos razones para esto std::forward :

  1. Para tener en cuenta los contenedores potenciales que implementan sobrecargas de operator[] calificadas por ref.
  2. Por coherencia: siempre que se use una variable declarada como referencia de reenvío (universal), aplique std::forward en ella. Período.

¿Alguna otra razón?


La razón # 1 es la relevante. Cuando implementas una función genérica, no entras en "¿Qué hacen estos tipos en particular que conozco?", Sino en "¿Qué sé sobre la cosa genérica con la que estoy trabajando?".

El contenedor genérico no dice nada acerca de la calificación de referencia, por lo que se reenvía.

Por supuesto, la razón # 2 es mucho más fácil de recordar y de la razón, así que debes seguir eso.

No creo que haya otras razones.