dev - ¿Cómo se leña `>>>` en C++ 0x?
c++17 (2)
>>>
es lexed como >> >
. Pero, ¿qué sucede si la primera >
cierra una lista de argumentos de plantilla, si el resultado es equivalente a > >>
o > >>
?
Importa en el siguiente código:
template<class T> struct X { };
void operator >>(const X<int>&, int) { }
int main() {
*new X<int>>> 1;
}
El texto del FDIS dice
De manera similar, el primer >> no anidado se trata como dos fichas consecutivas pero distintas>
No puede separar tokens y relex. Así que esto será un > > >
. Tenga en cuenta que la entrada a una implementación de C ++ se divide primero en tokens de preprocesamiento, y luego esos tokens se convierten en tokens de C ++. Entonces, primero su entrada son los tokens de C ++ >> >
, luego el analizador de C ++ los cambia a >> >
.
Cada token de preprocesamiento se convierte en un token. (2.7). Los tokens resultantes se analizan sintácticamente y semánticamente y se traducen como una unidad de traducción. [Nota: El proceso de analizar y traducir los tokens puede ocasionar que un token sea reemplazado por una secuencia de otros tokens (14.2). - nota final]
No hay posibilidad de que puedas combinar esas dos > >
fichas al final.
En esa pieza de código en particular, mi entendimiento es que será > >>
. El analizador es codicioso e intentará agrupar tanto como sea posible en cada token único, cuando se encuentre el primer >
, la regla de contexto dictará que es un token completo y que no debe intentar analizar más, pero una vez que lo es fuera del contexto de los argumentos de la plantilla, analizará el resto siguiendo las reglas generales, como si fuera X<int> >>
, o
typedef X<int> X_int;
X_int >> 1;