Waarom gebruiken C++17 gestructureerde bindingen geen { }?

Ik vond het oorspronkelijke voorstel voor *C++ gestructureerde bindingen hier. Het stelt een manier voor om gemakkelijk meerdere retourwaarden te binden, d.w.z.:

auto {a, b} = minmax(data);

Maar nu zie ik dat iedereen verwijst naar de C++17/C++1z-voorstelsyntaxis van

auto [a, b] = minmax(data);

Nu ik heb geleerd “lijsten zijn geschreven { like, this }” komt er een nieuwe lijst-syntaxis? Waarom? Wat is hier het probleem met accolades?


Antwoord 1, autoriteit 100%

Dit staat nog ter discussie. Het is moeilijk om er zeker van te zijn welke syntaxis het minst verwarrend zal zijn, gezien het aantal toepassingen dat er al zijn voor [] en {}.

Er is ook een risico dat “minst verwarrend” en “gemakkelijkst te ontleden” met elkaar in conflict komen.


Antwoord 2, autoriteit 100%

De nationale instanties van Spanje en de VS hebben voorgesteld om terug te gaan naar de {}-syntaxis omdat (P0488R0):

Het oorspronkelijk gebruikte voorstel voor ‘gestructureerde bindingen’
accolades “{}” om bindende identifiers af te bakenen. Die
scheidingstekens zijn gewijzigd in haakjes “[]” onder de
bewering dat ze geen syntactische hebben geïntroduceerd
probleem. Ze bleken echter te introduceren
syntactische ambiguïteit met attributen en lambda’s. In
het licht van verschillende voorgestelde oplossingen, lijkt het erop dat de
originele syntaxis is meer geschikt.

Daarom bestaat nog steeds de mogelijkheid om de originele syntaxis voor C++17 te hebben (waarvan de meeste gebruikers naar mijn mening de voorkeur hebben).


Updatevan deze reisverslag:

Het oorspronkelijke voorstel voor decompositieverklaringen gebruikte de syntaxis auto {a, b, c};die tijdens de laatste vergadering werd gewijzigd in auto [a, b, c]. Deze wijziging was nogal controversieel, en verschillende commentaren vroegen om het terug te veranderen in {}(terwijl anderen aanmoedigden om de []te behouden). Er zijn technische argumenten aan beide kanten (de syntaxis []kan conflicteren met attributen zodra u geneste decomposities begint toe te staan; de syntaxis {}kan conflicteren met uniforme initialisatie als u Concepts gooit in de mix en sta het gebruik van een conceptnaam toe in plaats van auto), dus uiteindelijk is het grotendeels een kwestie van smaak. De uitvoerders van de clang meldden dat ze beide hadden geprobeerd en vonden dat de dubbelzinnigheden gemakkelijker te omzeilen waren met []. Uiteindelijk was er geen consensus voor een verandering, dus de status-quo ([]syntaxis) blijft.


Antwoord 3, autoriteit 76%

@SebastianWahl heeft alleen gereageerd met een link. Ik zal de inhoud achter de link snel samenvatten.

Het antwoord van Chandler Carruth op deze vraag: youtu.be/430o2HMODj4?t=15m50s

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

is ok met auto. Maar je kunt dit ook doen:

tuple<int,float,string> [a,b,c] = f();

Dus als je {...}gebruikt, wordt dit

tuple<int,float,string> {a,b,c} = f();  //<<< not C++17

wat slechtis, omdat het stuk tuple<int,float,string> {a,b,c}heeft ook een betekenis in C++ en zou dus een moeilijke dubbelzinnigheid zijn, moeilijk op te lossen.


Antwoord 4, autoriteit 48%

De wijziging van {} naar [] vond plaats na Jacksonville en werd gemaakt naar aanleiding van opmerkingen van die vergadering. Dit wordt gedetailleerd beschreven in p0144r2, waarin staat : “omdat het visueel meer verschilt van de bestaande syntaxis voor het declareren van meerdere variabelen van hetzelfde type.”

Het lijkt erop dat de opmerkingen van de NB waarin werd verzocht om een ​​wijziging van het oorspronkelijke gebruik van {} de consensus tijdens de vergaderingen van november 2016 niet hebben vergroot, waardoor het gebruik van [] intact is gebleven. In ieder geval tot de voorjaarsbijeenkomst.


Antwoord 5, autoriteit 14%

Eén ding dat gezegd moet worden over de syntaxis van vierkante haken is dat deze sterk lijkt op lambda-capture-clausules, waarbij je evenmin het type variabele specificeert, aangezien autogeïmpliceerd is. D.w.z.

auto func = [a, b] {}
auto func = [a=1, b=2.0] {}

Het is natuurlijk niet precies hetzelfde, maar als je het beschouwt als “syntaxis voor automatisch vastleggen door de context te begrijpen”, kan het werken:

auto [a, b] = std::make_pair(1, 2.0);

Other episodes