c++ language-lawyer c++17

c++ - std:: ignorar con enlaces estructurados?



language-lawyer c++17 (2)

¿Será posible hacer algo similar utilizando la nueva sintaxis de enlaces estructurados?

No. Solo tendrá que inventar un nombre de variable que no se mencionará más adelante.

Preludio:

std::tuple<int, int, int> f(); std::tuple<int, int, float, int> g();

C ++ 1z introducirá sintaxis para enlaces estructurados que permitirán escribir en lugar de

int a, b, c; std::tie(a, b, c) = f();

algo como

auto [a, b, c] = f();

Sin embargo, std::tie también permitió especificar std::ignore para ignorar ciertos componentes, por ejemplo:

std::tie(a, b, std::ignore, c) = g();

¿Será posible hacer algo similar utilizando la nueva sintaxis de enlaces estructurados? ¿Cómo funcionaría?


La propuesta de enlaces estructurados contiene una sección dedicada que responde a su pregunta ( p0144r2 ):

3.8 ¿Debería haber una manera de ignorar explícitamente los componentes?

La motivación sería silenciar las advertencias del compilador sobre los nombres no utilizados. Creemos que la respuesta debería ser "todavía no". Esto no está motivado por casos de uso (silenciar las advertencias del compilador es una motivación, pero no es un caso de uso per se), y es mejor dejarlo hasta que podamos volver a examinarlo en el contexto de una propuesta de coincidencia de patrones más general en la que esto debería caer como un caso especial.

La simetría con std::tie sugeriría usar algo como std::ignore :

tuple<T1,T2,T3> f(); auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

Sin embargo, esto se siente incómodo.

Anticipar la coincidencia de patrones en el lenguaje podría sugerir un comodín como _ o * , pero como todavía no tenemos coincidencia de patrones, es prematuro elegir una sintaxis que sabemos que será compatible. Esta es una extensión pura que puede esperar para ser considerada con la coincidencia de patrones.

Sin embargo, tenga en cuenta que el borrador de trabajo de la Norma está siendo revisado actualmente por los Organismos Nacionales (NB) relevantes, y hay un comentario de NB que solicita esta característica ( P0488R0 , US100):

Las declaraciones de descomposición deberían proporcionar una sintaxis para descartar algunos de los valores devueltos, del mismo modo que std::tie usa std::ignore .