std :: yapılandırılmış bağlamalarla yoksayılsın mı?


87

Başlangıç:

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

C ++ 1z, yapılandırılmış bağlamalar için sözdizimi sunacak ve bunun yerine yazmayı mümkün kılacaktır.

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

gibi bir şey

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

Bununla birlikte, belirli bileşenlerin yok sayılmasına std::tieda izin verilir std::ignore, örneğin:

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

Yeni yapılandırılmış bağlama sözdizimini kullanarak benzer bir şey yapmak mümkün olacak mı? Nasıl çalışır?


2
Oraya rastgele bir isim koyun.
n. zamirler 'm.

1
@nm keyfi bir ad bir kopya oluşturmaz mı?
Piotr Skotnicki

1
@Piotr std::ignoreBence daha fazla kopya değil . Kopya seçimini garantilediğimiz için, kukla değişken başlatılır; ile std::tieatamanın rhs'sinde olan geçici std::ignorebaşlatılır.
j6t

1
auto[IGNORE]Benzersiz bir ad üreten bir makroya sahip olmak mümkün olabilir (örn: derleyiciye özgü SAYAÇ veya HAT ile ). Bu okunabilir yeterli olacaktır, ve pratikte gibi işleyeceğine std::ignoreiçin std::tie.
KABoissonneault

2
@PiotrSkotnicki Hayır, bir decomp bildiriminin yaptığı tek kopya, ayrıştırılan şeydir. Bildirilen şeyler ya o şeyin üyelerine / öğelerine takma adlar ya da getgeri dönenlere bağlanan referanslardır .
TC

Yanıtlar:


62

Yapılandırılmış bağlama önerisi, sorunuzu yanıtlayan özel bir bölüm içerir ( P0144R2 ):

3.8 Bileşenleri açıkça görmezden gelmenin bir yolu olmalı mı?

Motivasyon, kullanılmayan adlar hakkındaki derleyici uyarılarını susturmak olacaktır. Cevabın "henüz değil" olması gerektiğini düşünüyoruz. Bu, kullanım durumları tarafından motive edilmez (derleyici uyarılarını susturmak bir motivasyondur, ancak kendi başına bir kullanım durumu değildir) ve bunu, düşmesi gereken daha genel bir kalıp eşleştirme önerisi bağlamında yeniden gözden geçirene kadar en iyisidir. özel bir durum olarak.

Simetri ile aşağıdaki std::tiegibi bir şey kullanılmasını önerir std::ignore:

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

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

Ancak bu garip geliyor.

Dilde kalıp eşleştirmesini tahmin etmek , _veya gibi bir joker karakter önerebilir *, ancak henüz kalıp eşleştirmemiz olmadığından, uyumlu olacağını bildiğimiz bir sözdizimi seçmek için erken. Bu, desen eşleştirmesi ile dikkate alınmayı bekleyebilecek saf bir uzantıdır.

Ancak, Standardın çalışma taslağının şu anda ilgili Ulusal Organlar (NB) tarafından revize edildiğini ve bu özelliği talep eden bir Onaylanmayan Taraf yorumu ( P0488R0 , US100) olduğunu unutmayın:

Ayrıştırma bildirimleri, tıpkı std::tiekullanımlarda olduğu gibi, döndürülen değerlerden bazılarını atmak için sözdizimi sağlamalıdır std::ignore.


6
Artık çok geç, ancak kullanımı garip görünen ve muhtemelen gelecekte değiştirilecek bir özelliğin, bu özelliği hiç kullanamamaktan daha iyi olduğunu ve bu tür bir özellik gibi görünmediğini belirtmek isterim. standartlar komitesinin bir zaman makinesi istemesine neden olacak şey, çünkü std::ignoreyapılandırılmış bağlamalarda başka makul bir yorum yok .
Daniel H

11

Yeni yapılandırılmış bağlama sözdizimini kullanarak benzer bir şey yapmak mümkün olacak mı?

Hayır. Daha sonra bahsedilmeyecek bir değişken adı oluşturmanız gerekecek.


25
Kullanılmayan değişken uyarısı oluşturacak -Wunused-variableşekilde kullanabilirsiniz: [[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);ancak bu, herhangi birinin kullanılmayabileceği anlamına gelir, hangisini bilemezsiniz. şu anda bu dava için iyi bir çözüm yok. umarım c ++ 20'de geliştirilecektir. buradan alınmıştır: stackoverflow.com/questions/41404001/…
serin

3
"Şu anda bu durum için iyi bir çözüm yok" : Bu tamamen doğru değil: Diğer değişkenleri etkilemeden, kullanılmayan değişken uyarısından kurtulmak için kullanabilirsiniz(void)dummy; .
andreee

16
@andreee: Bir uyarıyı susturmak için bir ifade kullanmak, "iyi çözüm" olarak adlandırdığım şey değildir.
Nicol Bolas

"Bir uyarıyı susturmak için bir ifade kullanmak ..." İfadelerimiz bitiyor mu?
AndyJost

2
@AndyJost: Hayır, ancak ekrandaki görsel alan miktarımız tükeniyor. Bir uyarıyı susturmak için onu, özellikle de değerli dikey alanı harcamak yararlı değildir.
Nicol Bolas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.