Preludium:
std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();
C ++ 1z wprowadzi składnię powiązań strukturalnych, która umożliwi pisanie zamiast
int a, b, c;
std::tie(a, b, c) = f();
coś jak
auto [a, b, c] = f();
Jednak można std::tie
również określić std::ignore
ignorowanie niektórych komponentów, np .:
std::tie(a, b, std::ignore, c) = g();
Czy będzie możliwe zrobienie czegoś podobnego przy użyciu nowej składni strukturalnych powiązań? Jak by to działało?
c++
language-lawyer
c++17
jotik
źródło
źródło
std::ignore
. Ponieważ mamy zagwarantowane wykluczenie kopiowania, zmienna zastępcza jest inicjalizowana; zstd::tie
,std::ignore
inicjowany jest element tymczasowy znajdujący się w prawej części przypisania do .auto[IGNORE]
które generuje unikalną nazwę (np. Z LICZNIKIEM lub LINIĄ specyficzną dla kompilatora ). Byłby wystarczająco czytelny, aw praktyce funkcjonowałby jakstd::ignore
dlastd::tie
.get
zwraca.Odpowiedzi:
Propozycja powiązań strukturalnych zawiera dedykowaną sekcję z odpowiedzią na Twoje pytanie ( P0144R2 ):
Należy jednak pamiętać, że wersja robocza Standardu jest obecnie aktualizowana przez odpowiednie organy krajowe (NB) i istnieje komentarz NB dotyczący tej funkcji ( P0488R0 , US100):
źródło
std::ignore
w strukturalnych wiązaniach.Nie. Będziesz musiał tylko wymyślić nazwę zmiennej, która nie zostanie wymieniona później.
źródło
-Wunused-variable
, możesz użyć:[[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);
ale to oznacza, że każda z nich może być nieużywana, nie będziesz wiedział, która. w tej chwili nie ma dobrego rozwiązania w tej sprawie. miejmy nadzieję, że zostanie poprawiony w C ++ 20. pobrane stąd: stackoverflow.com/questions/41404001/…(void)dummy;
aby pozbyć się ostrzeżenia o nieużywanej zmiennej bez wpływu na inne zmienne.