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 se permite especificar std::ignore
que se ignoren ciertos componentes, por ejemplo:
std::tie(a, b, std::ignore, c) = g();
¿Será posible hacer algo similar usando la nueva sintaxis de enlaces estructurados? ¿Cómo funcionaría?
c++
language-lawyer
c++17
jotik
fuente
fuente
std::ignore
, creo. Como tenemos la elisión de copia garantizada, la variable ficticia se inicializa; constd::tie
,std::ignore
se inicializa el temporal que está en el lado derecho de la asignación .auto[IGNORE]
que genere un nombre único (por ejemplo, con COUNTER o LINE específico del compilador ). Sería lo suficientemente legible, y en la práctica funcionaría comostd::ignore
parastd::tie
.get
regresa.Respuestas:
La propuesta de enlaces estructurados contiene una sección dedicada que responde a su pregunta ( P0144R2 ):
Sin embargo, tenga en cuenta que el borrador de trabajo de la Norma está siendo revisado actualmente por los Organismos Nacionales relevantes (NB), y hay un comentario de NB que solicita esta característica ( P0488R0 , US100):
fuente
std::ignore
enlaces estructurados.No. Solo tendrá que inventar un nombre de variable que no se mencionará más adelante.
fuente
-Wunused-variable
, puede usar:[[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);
pero eso significa que cualquiera de ellas puede estar sin usar, no sabrá cuál. no hay una buena solución para ese caso en este momento. con suerte se mejorará en c ++ 20. tomado de aquí: stackoverflow.com/questions/41404001/…(void)dummy;
para deshacerse de la advertencia de variable no utilizada sin afectar las otras variables.