Как попросить небольшое дополнение? (синтаксис чисто виртуальных функций)

В текущем проекте C++0x Я заметил, что они ввели несколько новых явных ключевых слов, чтобы выделить ожидаемое поведение (отличный ход!).

Примеры: по умолчанию/удалены функции (< em>= по умолчанию и = удалить), новый nullptr, ключевое слово явное может использоваться также для операторов преобразования, ...

Поэтому я ожидал увидеть также синтаксис = pure для чисто виртуальных функций.

Вместо этого уродливая (ИМХО, конечно) вещь = 0 все еще существует.

Хорошо, я могу использовать #define pure 0 (иногда я так и делаю), но я думаю, что согласованность/непротиворечивость определенно должна быть целью стандарта. Более того, я знаю, что это просто своего рода ультрапедантичный запрос, но = 0 действительно была одной из моих наименее любимых частей C++ (эвфемизм)...

Мои вопросы:

  • Я знаю, что новый стандарт полнофункционален, но можно ли еще попросить это маленькое педантичное дополнение, хотя бы просто как «обязательный макрос»?
  • если ответ положительный то как? (кто-нибудь из членов комитета поблизости?)
  • я просто слишком педантичен (или ошибаюсь), чтобы спросить об этом дополнении? что вы думаете о текущем синтаксисе чисто виртуальных функций?

person Gian Paolo Ghilardi    schedule 12.05.2009    source источник
comment
+1 от меня кстати. Это очень хороший вопрос, и я думаю, комитету по стандартам понравилось бы, если бы больше людей интересовались их работой. :)   -  person jalf    schedule 12.05.2009
comment
Спасибо! Как сказано в других комментариях, я не эксперт, и я только начал читать последний черновик (1347 страниц)...   -  person Gian Paolo Ghilardi    schedule 12.05.2009


Ответы (5)


Это не маленькое педантичное изменение. Введение нового ключевого слова — одно из самых больших изменений, о которых вы можете просить. Это то, чего они стараются избежать почти любой ценой. Подумайте обо всем коде, в котором используется слово «чистый», который может сломаться.

Как правило, их рекомендация состоит в том, чтобы добавлять в язык только то, что нельзя было сделать раньше. Ключевое слово pure не активирует ничего нового (в отличие от ключевого слова nullptr, которое, например, обеспечивает лучшую проверку типов), поэтому ожидайте, что оно будет иметь очень низкий приоритет. Имейте в виду, что все, что они делают, в основном является ремонтной работой. Цель №1 — не сломать язык (или существующий код, который его использует). Любые добавленные функции добавляются только в том случае, если это можно сделать без нарушения обратной совместимости.

Однако комитет является более или менее открытым форумом. Просмотрите их веб-сайт, и вы сможете найти несколько адресов электронной почты. ИЛИ используйте группу новостей comp.std.c++.

Я полагаю, что их встречи также открыты, так что вы можете просто прийти без приглашения на следующее. ;)

person jalf    schedule 12.05.2009
comment
Я сам не эксперт, но я думаю, что = pure, используемый в этом контексте, не должен ничего ломать. В любом случае, что касается проблемы с ключевым словом pure as new, я думаю, вы правы: я вообще не рассматривал этот вопрос... Спасибо. - person Gian Paolo Ghilardi; 12.05.2009
comment
Спасибо за этот ответ. Интересно осознавать, что и default, и delete уже были ключевыми словами C++, но в разных контекстах. - person Benoît; 12.05.2009
comment
Однако один вопрос. Они ввели null_ptr в качестве нового ключевого слова. Если бы они назвали его undefined, было бы логично использовать его для определения чистых виртуальных функций, как предложил Джан... Или я сплю? :) - person Benoît; 12.05.2009
comment
Верно, я полагаю. Но тогда это потеряло бы смысл в контексте нулевого указателя. Нулевой указатель не является неопределенным. Это нулевое значение. Вы можете сравнить его с другими указателями и получить согласованный результат. Вы не можете сделать это с неопределенными значениями. И это смутило бы существующих программистов на C++. Они знают, что такое нулевой указатель, поэтому могут догадаться, что означает null_ptr. Но неопределенный? Однако вы правы, возможно, они могли бы найти слово, которое охватывало бы оба случая. Но опять же, сколько можно получить, сделав это? - person jalf; 12.05.2009
comment
'= void' немного странный в том смысле, что void — это тип. Я не могу вспомнить ни одного другого случая, когда ключевые слова типа выполняют двойную функцию. - person deft_code; 12.05.2009
comment
Лично мне не кажется странным называть неопределенным значение нулевого указателя. Но это только я. Что касается того, что можно было бы получить, я не знаю, я просто основываюсь на том, что вы сказали, что добавление ключевого слова является самым большим изменением в языке. Я предполагаю, что это означает, что Вы должны сделать большую часть этого! - person Benoît; 13.05.2009
comment
@Бенуа: это неверно. Он не не определен. Он имеет очень конкретное и четко определенное значение. Большинство людей уже достаточно запутались в том, что является и что не является неопределенным. Void может работать, как предложил litb, но во всяком случае, я думаю, было бы более очевидно использовать новый null_ptr. По сути, это и есть чистая виртуальная функция. И 0 также является старым синтаксисом для нулевого указателя. - person jalf; 13.05.2009
comment
язык программирования D использует void в таких случаях, как int a = void; сказать, не инициализируйте его, если я правильно помню. - person Johannes Schaub - litb; 14.05.2009
comment
void обычно имеет значение выражения отсутствия чего-либо. Подобно приведению к void, выражается отсутствие использования вычисленного значения. void в списках параметров выражает отсутствие параметров и, конечно же, как возвращаемый тип, чтобы выразить отсутствие возвращаемого значения. и =void будет выражать отсутствие реализации или, точнее, необходимость реализации в производном классе. - person Johannes Schaub - litb; 14.05.2009
comment
Кстати, это уже nullptr, а не null_ptr. - person Klaim; 14.05.2009
comment
Чисто виртуальные функции могут иметь реализацию. Таким образом, утверждение, что =void означает отсутствие реализации, может ввести в заблуждение. Опять же, =void ничем не хуже =0 в качестве мнемонического имени для чистого виртуального. - person deft_code; 17.05.2011
comment
как насчет = виртуальный, это выглядит немного странно ( виртуальный f() = виртуальный; ), но имеет некоторый смысл (это действительно виртуальный) - person Ferruccio; 21.08.2011

Что вы больше всего ненавидите в C++, так это "= 0;"???

Вы когда-нибудь использовали этот язык? Есть много других вещей, на которые вы могли бы потратить свою ненависть с большей пользой.

<Flame retardant>Я использую C++ более 10 лет. Для меня это по-прежнему предпочтительный язык всякий раз, когда мне нужно выполнить тяжелую вычислительную работу.</Flame retardant>

person j_random_hacker    schedule 12.05.2009
comment
Это не самое худшее в этом языке, ИМХО (6+ лет на этом языке, кстати). Но я ужасно ненавижу эту вещь с первого дня работы с C++, и когда я увидел черновики (эту и предыдущую), я ожидал увидеть что-то на этом фронте. Другими словами: я думаю, что это дополнение настолько маленькое, что его можно было бы включить в следующий черновик. Я не ожидал проблемы с новым ключевым словом, поскольку мое предложение ограничивалось только обязательным макросом. :) - person Gian Paolo Ghilardi; 12.05.2009
comment
Но макрос вызовет еще больше проблем. Если бы это было ключевое слово, компилятор мог бы ограничить область видимости, чтобы она не затрагивала переменные или функции с именем pure. Но макрос просто заменит их all на 0. :) - person jalf; 12.05.2009
comment
Да, это проблема. Я задал этот вопрос, предложив простое предложение, а не идеальное решение. Извините... ^^' - person Gian Paolo Ghilardi; 12.05.2009

Сначала начните читать comp.std.c++ группу новостей. Это место для общественных дискуссий.

Во-вторых, я бы сказал, что к текущему проекту C++0x будут применяться только опечатки, комитет действительно находится на завершающей стадии.

Если вы чрезвычайно заинтересованы, сделайте свое предложение в группе новостей с действительно хорошим обоснованием. И ждите, что он будет сбит. Существенно более полезных предложений (например, модулей) не было.

Приложение: Если вы хотите, чтобы что-то подобное развивалось, вам нужно либо присоединиться (ANSI имеет) к комитету, либо найти кого-то в комитете, чтобы продвигать ваше предложение.

person Richard    schedule 12.05.2009
comment
Спасибо за ваш вопрос. Я знаю, что мое предложение мелкое, педантичное, второстепенное, ... но я не прошу луну. Может быть, я ошибаюсь, но связность и последовательность важнее того дополнения, о котором я прошу. - person Gian Paolo Ghilardi; 12.05.2009
comment
Вы просите луну. Как указал Джалф, вы запрашиваете новое ключевое слово, которое не добавляет никакой новой выразительности. Кстати, ответ Ричарда мертв. Я был сбит прежде в обсуждениях стандартов. Это не смертельно. - person David Thornley; 12.05.2009
comment
Я абсолютно согласен с вами (со всеми) по поводу: никаких изменений в выразительности => зачем менять, возможно, ломая существующее?. Вы можете рассматривать мое предложение как чисто (LOL) эстетическое. Я просто хотел бы избежать этого: ... = удалить; ... = по умолчанию; ... = 0; Если мое предложение звучит так, будто вы просите луну, я смиренно отказываюсь от этого (очень жаль, без шуток). Спасибо! :) - person Gian Paolo Ghilardi; 12.05.2009

Слишком поздно. Прием заявок закончился пару лет назад.

(Была страница, на которой хранились материалы, но я больше не могу найти этот список.)

person graham.reeds    schedule 12.05.2009
comment
Хорошо, я попробую еще раз, позже... Спасибо. - person Gian Paolo Ghilardi; 12.05.2009
comment
Не расстраивайтесь - изначально это предлагали другие. Мои предложения были такими: отказаться от int, short и т. д. и заменить их на int8, int16 и т. д. А также отказаться от char и нового типа глифа, который будет классом шаблона, представляющим символы Unicode. - person graham.reeds; 12.05.2009
comment
Я полагаю, что типы C99 (например, int16_t) были приняты в стандарт, но в качестве typedef вы получаете включение файла заголовка. Комитет крайне неохотно вводит новые ключевые слова, но необязательные typedef вряд ли причинят кому-либо неудобства. - person David Thornley; 12.05.2009
comment
Да, но меня раздражало крайне тусклое слово «long long» для 64-битных типов. Что произойдет, когда мы доберемся до 128 бит? "долго-долго"? Определяя размер типов данных в самом типе, вы не получаете этот глупый тип a '›= type b', который у нас есть сейчас, и очевидно, что вы используете, и упрощает перенос кода. - person graham.reeds; 12.05.2009

В дополнение к jalf о недостатках добавления ключевого слова (с которым я согласен на 100%) следует также отметить, чем в информатике фраза чистая функция уже имеет значение. Это означает, что при одних и тех же параметрах функция всегда возвращает одно и то же значение и не имеет побочных эффектов. Таким образом, выбор = pure для обозначения виртуальной функции, которая должна быть переопределена, был бы плохим выбором синтаксиса.

person Motti    schedule 13.05.2009