std::forward_list
proporciona insert_after
y erase_after
miembros que pueden no necesitar acceder realmente al objeto std::forward_list
. Por lo tanto, se pueden implementar como funciones de miembro static
y llamar sin un objeto de lista, lo cual es útil para un objeto que quiere eliminarse de una lista, que es un uso muy común. EDITAR: Esta optimización solo se aplica a las especializaciones forward_list
en std::allocator
o asignadores sin estado definidos por el usuario.¿Pueden los miembros de std :: forward_list implementarse como estáticos?
¿Puede una implementación conforme al estándar hacer esto?
§17.6.5.5/3 dice
A call to a member function signature described in the C++ standard library behaves as if the implementation declares no additional member function signatures.
con una nota al pie
A valid C++ program always calls the expected library member function, or one with equivalent behavior. An implementation may also define additional member functions that would otherwise not be called by a valid C++ program.
No me queda claro si la adición de static
crearía una función miembro "diferente", pero la eliminación de un (implícita El argumento no debería romper nada que añadir argumentos no cumplidos no lo haría, y eso es legal. (No se puede legalmente tomar un PTMF a ninguna función de miembro estándar.)
Me parece que a la biblioteca se le debe permitir hacer esto, pero no estoy seguro de si se romperá alguna regla. ¿Y cuán normativos son los prototipos de función miembro enumerados?
Las operaciones de lista de mutaciones requieren acceso al asignador de la lista, por lo que dudo que puedan ser estáticas (especialmente con las nuevas asignaciones con estado). –
Aún así, la plantilla puede ser especializada para el caso extremadamente común de 'std :: allocator' y del mismo modo para el usuario si lo desea. – Potatoswatter
¿Cómo se especializaría esto basándose en el conocimiento sobre * iterator * solo? El iterador no sabe a qué lista pertenece, ni qué asignador utiliza esa lista. –