2016-11-18 19 views
24

Prelude:std :: ignore z powiązaniami strukturalnymi?

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

C++ 1z wprowadzi składni powiązań strukturalnych, które umożliwi napisać zamiast

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

coś podobnego

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

jednak std::tie także można podać std::ignore, aby zignorować niektóre komponenty, np .:

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

będzie to możliwe, aby zrobić coś podobnego przy użyciu nowej składni powiązań strukturyzowane? Jak by to działało?

+1

Po prostu umieść tam dowolną nazwę. –

+0

@ n.m. czy dowolna nazwa nie utworzy kopii? –

+1

@Piotr Nie więcej kopii niż z 'std :: ignore', myślę.Ponieważ mamy gwarancję kopiowania, inicjowana jest zmienna obojętna; z 'std :: tie', inicjowany jest tymczasowy, który znajduje się w rhs przypisania do' std :: ignore'. – j6t

Odpowiedz

15

Strukturalny propozycja Wiązania zawiera specjalną sekcję odpowiadając na pytanie (P0144R2):

3,8 powinien istnieć sposób jawnie ignorować komponenty?

Motywacją byłoby wyciszenie ostrzeżeń kompilatora o nieużywanych nazwach. Uważamy, że odpowiedź powinna brzmieć "jeszcze nie". Nie jest to uzasadnione przypadkami użycia (wyciszanie ostrzeżeń kompilatora jest motywacją, ale nie jest to przypadek użycia per se), i najlepiej pozostawić, dopóki nie będziemy mogli powtórzyć tego w kontekście bardziej ogólnej propozycji dopasowania wzorców, w przypadku gdy powinno to wypaść jako szczególny przypadek.

Symetria z std::tie sugerowałoby użyciu coś jak std::ignore:

tuple<T1,T2,T3> f(); 

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 

to jednak czuje się niezręcznie.

Przewidywanie dopasowywania wzorców w języku może sugerować wieloznaczność, taką jak _ lub *, ale ponieważ nie mamy jeszcze dopasowania wzorca, jest zbyt wcześnie, aby wybrać składnię, o której wiemy, że będzie zgodna. To jest czyste rozszerzenie, które może czekać na rozpatrzenie z dopasowaniem do wzorca.

Należy jednak pamiętać, że projekt roboczy Standardem jest obecnie przeglądowi przez właściwe organy krajowe (NB), a tam jest komentarz NB zainteresowanie tej funkcji (P0488R0, US100):

Deklaracje deklaracji powinny zapewniać składnię, aby odrzucić niektóre zwrócone wartości, tak jak std::tie używa .

+1

Jest już za późno, ale chciałbym zwrócić uwagę na tę funkcję, która wydaje się niezręczna w użyciu i prawdopodobnie zostanie zastąpiona w przyszłości jest lepsza niż * brak możliwości korzystania z funkcji w ogóle *, a to nie wydaje się być rzeczą, która sprawi, że komitet standardów będzie chciał maszyny czasu, ponieważ nie ma inna rozsądna interpretacja 'std :: ignore' w powiązaniach strukturalnych. –

2

Czy będzie można zrobić coś podobnego za pomocą nowej składni powiązań strukturalnych?

Nie. Będziesz musiał nadać nazwę zmiennej, o której nie będzie mowa w dalszej części.

+4

, który wygeneruje nieużywane zmienne ostrzegawcze '-Wunused-variable', możesz użyć:' [[maybe_unused]] auto [a, b, manekin] = std :: tuple (1, "2", 3f); 'ale to oznacza, że ​​którekolwiek z nich może być nieużywane, nie będziesz wiedział, który z nich. w tej sprawie nie ma dobrego rozwiązania. mam nadzieję, że poprawi się w C++ 20. zaczerpnięte stąd: https://stackoverflow.com/questions/41404001/structured-binding-w-maybe-unused?noredirect=1&lq=1 – serine

Powiązane problemy