2016-10-30 4 views
48

Я нашел оригинальное предложение для структурированных привязок * C++ here. Он предлагает способ легко связать несколько возвращаемых значений, то есть:Почему структурированные привязки C++ 17 не используются {}?

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

Но теперь я вижу, что все указывает на C++ 17/C++ 1z предложение синтаксиса

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

Теперь, Я узнал, что «списки написаны (например, это)» появляется новый синтаксис списка? Зачем? В чем проблема с фигурными фигурными скобками здесь?

+2

Обычно изворотливые изменения, как, что имеют отношение к упрощению жизни парсеров. – Yakk

+9

Одна проблема с фигурными скобками заключается в том, что скобки до сих пор ограничивают области, и здесь они не будут. Напротив, вы можете думать о квадратных скобках, как в списке лямбда-захвата, и это получается разумно красиво. –

+3

Примечание: еще нет C++ 17. C++ 17 все еще работает. Что будет и чего не будет в нем, и в какой форме не будет известно наверняка, по крайней мере, до февраля. –

ответ

20

Это все еще обсуждается. Трудно быть уверенным, какой синтаксис будет наименее запутанным, учитывая, сколько из них используется для [] и {}.

Существует также риск, что «наименее запутанный» и «самый простой для анализа» будет в конфликте.

+20

Простите меня, мисс, но является ли это constexpr lambda в вашем размере массива или атрибутом структурированного привязки? –

+0

, возможно, ранняя реализация clang ++, которая уже запутала нас. – towi

9

Изменение от {} до [] произошло после Джексонвиля и было сделано в ответ на комментарии к этой встрече. Это подробно описано в p0144r2, в котором говорится: «потому что он более визуально отличается от существующего синтаксиса для объявления нескольких переменных того же типа».

Похоже, что комментарии NB, требующие изменения первоначального использования {}, не достигли консенсуса на встречах в ноябре 2016 года, оставив использование [] неиспользованным. По крайней мере, до весенней встречи.

+0

действительно? о мой. Это? – towi

+0

@towi это одна из тех ужасно субъективных заявлений. Я не смог найти какой-либо документ, содержащий протоколы заседаний, из сеанса в Джексонвилле, где было предложено изменение, поэтому я могу только догадываться. –

20

национальных органов из Испании и США предложили, чтобы вернуться к {} синтаксису, потому что (P0488R0):

«структурированные привязок» предложение первоначально использовал фигурные скобки «{}», чтобы разграничивать связывание идентификаторов. Эти разделители были заменены на скобки «[]» в соответствии с утверждением , что они не представили никакой синтаксической проблемы . Однако они оказались в синтаксической двусмысленности с атрибутами и лямбдами. В свет различных предложенных исправлений, кажется, более подходящим является исходный синтаксис .

Таким образом, по-прежнему остается возможность получить исходный синтаксис для C++ 17 (который, как я полагаю, предпочитает большинство пользователей).


Update от этого trip report:

Первоначальное предложение для деклараций разложения используется синтаксис auto {a, b, c};, который был изменен на последнем заседании auto [a, b, c]. Это изменение было довольно противоречивым, и несколько комментариев попросили изменить его на {} (в то время как другие рекомендовали сохранить []). Существуют технические аргументы с обеих сторон (синтаксис [] может конфликтовать с атрибутами, как только вы начнете разрешать вложенные разложения, синтаксис {} может конфликтовать с единообразной инициализацией, если вы бросаете Concepts в микс и позволяете использовать концептуальное имя вместо auto), поэтому в конце концов, это во многом вопрос вкуса. Разработчики clang сообщили, что они попробовали оба, и обнаружили, что двусмысленности проще работать с [].В конце концов, не было консенсуса в отношении изменения, поэтому статус-кво ([] синтаксис) остается.

+0

Хотя я не согласен и не согласен с желанием изменить разделители на исходный синтаксис, мне кажется смешным, что один из NB описал это изменение как внезапное или последнее, когда было сделано несколько изменений назад. –

+0

@MikelF В дополнение к ES и US есть также комментарий от GB: «Вложенные объявления разложения не могут работать, поскольку они сталкиваются с синтаксисом атрибута» – metalfox

12

@SebastianWahl только прокомментировал ссылку. Я быстро подытожу содержание ссылки. Ответ

Чандлер Каррут на этот вопрос: youtu.be/430o2HMODj4?t=15m50s

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

нормально с auto. Но вы также можете сделать это:

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

Так что, когда вы используете {...} это станет

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

который плохо, потому что часть tuple<int,float,string> {a,b,c} также имеет значение в C++ и, таким образом, будет сложная двусмысленность, трудно решить.

3

Одна вещь, которая должна быть указана для синтаксиса квадратных скобок, состоит в том, что она очень похожа на предложения об удержании лямбда, где, аналогично, вы не указываете тип переменной, поскольку подразумевается авто. То есть

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

Это явно не та же самая вещь, но когда вы думаете о нем, как «синтаксис для автоматического захвата, делая чувство контекста,» он может работать:

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