Re[5]: return void
От: CRT  
Дата: 15.06.23 12:24
Оценка:
Здравствуйте, rg45, Вы писали:


R>Выходит, что до этого эта фича шла на правах расширения, причем, не только в gcc, но и в msvc (и вероятно в других компилерах тоже). Мне даже запомнилось, что достаточно давно (лет десять назад, наверное) у меня был пост на РСДН, в котором я акцентировал внимание на этой возможности.


Сейчас попробовал в C++Builder 6 (а это 2002 год)
и оно там работает.
Re[6]: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.06.23 12:32
Оценка:
Здравствуйте, andrey.desman, Вы писали:

AD>2005 год.


В ISO/IEC 14882 Second edition (2003-10-15) — то же самое.
Re[6]: return void
От: rg45 СССР  
Дата: 15.06.23 12:34
Оценка:
Здравствуйте, andrey.desman, Вы писали:


AD>2005 год.


AD>

AD>3.9.1 Fundamental types
AD>The void type has an empty set of values. The void type is an incomplete type that cannot be completed. It is used as
AD>the return type for functions that do not return a value. Any expression can be explicitly converted to type cv void (5.4).
AD>An expression of type void shall be used only as an expression statement (6.2), as an operand of a comma expression
AD>(5.18), as a second or third operand of ?: (5.16), as the operand of typeid, or as the expression in a return statement
AD>(6.6.3) for a function with the return type void.


AD>6.6.3 The return statement [stmt.return]
AD>3 A return statement with an expression of type “cv void” can be used only in functions with a return type of cv void; the
AD>expression is evaluated just before the function returns to its caller.


Фу, блин, ну я и слепошара. Это же самое есть даже в С++98, в этих же самых пунктах и формулировках. Начиная с C+17 просто предложения перетасовали немного.
--
Справедливость выше закона. А человечность выше справедливости.
Re: return void
От: CRT  
Дата: 15.06.23 12:36
Оценка: 18 (1) +1
Здравствуйте, pva, Вы писали:
pva>Ну, чтобы наконец-то вроде такого
pva>
pva>void doActionA() {}
pva>void doActionB() {}
pva>void dispatch(Actions action) {
pva>  switch (action) {
pva>     case Actions::A: return doActionA();
pva>     case Actions::B: return doActionB();
pva>  }
pva>}
pva>


И чем это лучше чем
void dispatch(Actions action) {
  switch (action) {
    case Actions::A: doActionA(); return;
    case Actions::B: doActionB(); return;
  }
}
???
По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода
Отредактировано 15.06.2023 12:51 CRT . Предыдущая версия . Еще …
Отредактировано 15.06.2023 12:36 CRT . Предыдущая версия .
Re[2]: return void
От: rg45 СССР  
Дата: 15.06.23 14:16
Оценка: +4
Здравствуйте, CRT, Вы писали:

CRT>И чем это лучше чем

CRT>
CRT>void dispatch(Actions action) {
CRT>  switch (action) {
CRT>    case Actions::A: doActionA(); return;
CRT>    case Actions::B: doActionB(); return;
CRT>  }
CRT>}
CRT>
???

CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода

В данном примере, конечно ни чем. Но пример-то синтетический. А ты попробуй, например, реализовать аналог std::apply: тебе дают какую-то вызываемую сущность (функцию, лямбду или функциональный объект пользовательского класса) и список фактических параметров, запакованных в std::tuple. Тебе нужно распаковать кортеж и передать аргументы в фунционал. И вернуть нужно то, что вернул функционал — возможно ссылку, возможно значение, а возможно ничего (void).
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 15.06.2023 14:43 rg45 . Предыдущая версия . Еще …
Отредактировано 15.06.2023 14:26 rg45 . Предыдущая версия .
Отредактировано 15.06.2023 14:24 rg45 . Предыдущая версия .
Отредактировано 15.06.2023 14:21 rg45 . Предыдущая версия .
Re[2]: return void
От: pva  
Дата: 15.06.23 17:01
Оценка:
Здравствуйте, CRT, Вы писали:

CRT>И чем это лучше чем

CRT>
CRT>void dispatch(Actions action) {
CRT>  switch (action) {
CRT>    case Actions::A: doActionA(); return;
CRT>    case Actions::B: doActionB(); return;
CRT>  }
CRT>}
CRT>
???

CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода

Ну, выше вон отписались по поводу функциональности кода. Добавлю еще немного с колокольни codestyle.
Я в случае более одного выражения, упаковую их обычно в блок (чтобы был единый стиль если прийдется объявлять переменные внутри ветки). Приходится писать, как-то так:
void dispatch(Actions action) {
  switch (action) {
    case Actions::A: {
      doActionA();
      return;
    }
    case Actions::B: {
      doActionB();
      return;
    }
  }
}


А если у нас веток 10+, то пока листаешь пару экранов — забываешь чего там в начале было. Память уже не та.
newbie
Отредактировано 15.06.2023 17:02 pva . Предыдущая версия .
Re[2]: return void
От: Mr.Delphist  
Дата: 15.06.23 22:34
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Я категорически против. Этак кто-нибудь захочет прибавить void, умножить на void...


Void там давно умножают, особенно в malloc
Re[6]: return void
От: ребусоид Интернет https://youtu.be/I3lhN5CUP2M
Дата: 02.07.23 12:10
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, rg45, Вы писали:


R>>Тебе кто-то поручал делать заявления от имени БОЛЬШИНСТВА?


ЕМ>Ну давайте посчитаем, кто из здешних знал об этой особенности до того, как ТС поднял вопрос.

ну я думаю те, кто столкнулся хоть раз с необходимостью реализовывать свои фанкшины, чтобы какой-нибудь вызов
return (this_ptr->*f_ptr)(args...);
приводил к необходимости парсить сигнатуру (хотя все равно придется в полноценном решении) и прочие прелести именно для войд.
Re[2]: return void
От: B0FEE664  
Дата: 03.07.23 10:30
Оценка:
Здравствуйте, Pzz, Вы писали:

pva>>задам и я свой нубский вопрос: не завезли ли в с++ return void?

Pzz>Это расширение gcc. Причем какое-то довольно давнишнее.

Не-а. Это всегда так было во всех компиляторах, начиная с самого начала, когда ещё даже синтаксис не устоялся.
Изначально у функции не обязательно было указывать возвращаемый тип, тогда (по умолчанию) возвращаемый тип считался int.
Более того, параметры функции можно было указать вне скобок перед телом:
foo()
int x  /* <=> int foo(int x) */
{
  /* код */
}

Потом добавили void, чтобы показать, что ничего не передаётся или не возвращается.
Сразу после этого многие стали писать функции без параметров так: void foo(void) и это поддерживается до сих пор, хотя void в качестве параметра почти никто не пишет.

Я не знаю точной причины зачем нужно было поддержать return foo();, но думаю, что это было сделано для удобства работы с макросами.
И каждый день — без права на ошибку...
Re[2]: return void
От: B0FEE664  
Дата: 03.07.23 10:33
Оценка:
Здравствуйте, CRT, Вы писали:

  Скрытый текст
pva>>Ну, чтобы наконец-то вроде такого
pva>>
pva>>void doActionA() {}
pva>>void doActionB() {}
pva>>void dispatch(Actions action) {
pva>>  switch (action) {
pva>>     case Actions::A: return doActionA();
pva>>     case Actions::B: return doActionB();
pva>>  }
pva>>}
pva>>


CRT>И чем это лучше чем

CRT>
CRT>void dispatch(Actions action) {
CRT>  switch (action) {
CRT>    case Actions::A: doActionA(); return;
CRT>    case Actions::B: doActionB(); return;
CRT>  }
CRT>}
CRT>
???

CRT>По-моему doActionA(); return; лучше чем return doActionA(); в плане ясности кода

В случае return doActionA(); есть гарантия, что dispatch() возвращает результат согласованный с результатом doActionA().
И каждый день — без права на ошибку...
Re[3]: return void
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.07.23 20:18
Оценка:
Здравствуйте, B0FEE664, Вы писали:

pva>>>задам и я свой нубский вопрос: не завезли ли в с++ return void?

Pzz>>Это расширение gcc. Причем какое-то довольно давнишнее.

BFE>Не-а. Это всегда так было во всех компиляторах, начиная с самого начала, когда ещё даже синтаксис не устоялся.


Мы говорим про совершенно конкретную конструкцию:

void foo(void) {
}

void bar(void) {
    return foo();
}


Она далеко не всегда официально поддерживалась. И насколько я помню, она очень давно появилась, как расширение, в gcc. А вот в стандарт вошла сравнительно недавно.

BFE>Я не знаю точной причины зачем нужно было поддержать return foo();, но думаю, что это было сделано для удобства работы с макросами.


Скорее всего. Или для удобства написания прогамм, которые генерируют код на Си.
Re[4]: return void
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.07.23 10:50
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>в стандарт вошла сравнительно недавно.


Тут уже дважды писали, что в стандарте оно минимум с 2003-го.
Re[5]: return void
От: Pzz Россия https://github.com/alexpevzner
Дата: 04.07.23 10:51
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

Pzz>>в стандарт вошла сравнительно недавно.


ЕМ>Тут уже дважды писали, что в стандарте оно минимум с 2003-го.


Дык для меня 2003-й — это "сравнительно недавно"
Re[4]: return void
От: B0FEE664  
Дата: 04.07.23 12:44
Оценка:
Здравствуйте, Pzz, Вы писали:

Мы говорим про совершенно конкретную конструкцию:
  Скрытый текст
Pzz>
Pzz>void foo(void) {
Pzz>}

Pzz>void bar(void) {
Pzz>    return foo();
Pzz>}
Pzz>

Pzz>Она далеко не всегда официально поддерживалась. И насколько я помню, она очень давно появилась, как расширение, в gcc. А вот в стандарт вошла сравнительно недавно.

Я не могу припомнить компилятора, который не поддерживал бы эту конструкцию. Если мне не изменяет память, даже Borland'овский Turbo C++ (и, кажется, Watcom) её поддерживали. А вот поддержку return void(); добавили позже, для шаблонов.
И каждый день — без права на ошибку...
Re[6]: return void
От: rg45 СССР  
Дата: 04.07.23 13:07
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Дык для меня 2003-й — это "сравнительно недавно"


На самом деле, с 98-го. Давнее уже не придумаешь
--
Справедливость выше закона. А человечность выше справедливости.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.