2011-04-01 5 views

Respuesta

18

El propósito de identity era hacer T no deducible. Es decir, forzar al cliente a suministrar explícitamente T al llamar al forward.

forward(a);  // compile-time error 
forward<A>(a); // ok 

La razón de esto es necesario es porque el parámetro de plantilla es el interruptorcon la que el cliente indica al compilador para reenviar el argumento ya sea como un valor izquierdo o como un valor p. Si accidentalmente se olvida de proporcionar esta información, los valores l siempre se devuelven como valores l y los valores r siempre se devuelven como valores r. Si bien al principio puede sonar como lo que quieres, realmente no lo es.

template <class T, class A1> 
std::shared_ptr<T> 
factory(A1&& a1) 
{ 
    return std::shared_ptr<T>(new T(std::forward<A1>(a1))); 
} 

En el ejemplo anterior a1 siempre es un lvalue. Pero el "interruptor" A1 puede o no ser una referencia lvalue. Si es una referencia lvalue, a1 se devuelve como valor l, de lo contrario, a1 se devuelve como un valor r. Si el autor de la fábrica se olvida por casualidad de suministrar A1, el uso de identity le recuerda al momento de la compilación.

Nota: El borrador final carece de identity, pero usa remove_reference en el mismo lugar para el mismo propósito.

+0

Creo que esto se explica mejor que mi respuesta, por lo que he eliminado el mío. Todavía me pregunto si hay un buen ejemplo en el que se pasa un argumento de valor a 'forward'. ¿Hay algún uso? Tal vez en la biblioteca estándar? –

+0

Ver el caso de uso B en http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2951.html. Tenga en cuenta que este documento propone una implementación avanzada que finalmente resultó problemática. Sin embargo, la especificación de reenvío final pasa y falla correctamente todos los casos de uso presentados en este documento. Aquí está el documento http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3143.html que señala el caso de uso final que se perdió N2951. –

+0

Una muy buena explicación, gracias. – user2023370

Cuestiones relacionadas